Dark_Knight
@Dark_Knight
Game Dev

Как заменить все совпадения в массиве?

Здравствуйте, подскажите пожалуйста.
Есть код:
var arr2 = ['0', '1', '2', '3', '4', '5', '4', '7', '8', '9', '4', '11'];

и функция, которая в цикле пробегается по массиву и найдя все совпадения, заменяет их на no.
function getRepeatArray(array) {
	var newArr = [];

    for (var j = 0; j < array.length; ++ j) {

        for (var k = j + 1; k < array.length; ++ k) {
            if (array[j] === array[k]) {
                array[j] = 'no';
                array[k] = 'no';
            }
        }
    }	
}

getRepeatArray(arr2);


Проблема в том, что ПОЧЕМУ ТО, заменяются не все совпадения, к примеру, сейчас у меня в консоли выводится следующее:
["0", "1", "2", "3", "no", "5", "no", "7", "8", "9", "4", "11"]

Как видите последний символ 4 не заменился!
Почему так, не могу понять, если оберу одну четверку и оставлю две, то обе заменятся в независимости от того, какую именно четверку я уберу.
Может у кого-то есть свой вариант реализации подобного.
Спасибо.
  • Вопрос задан
  • 2315 просмотров
Решения вопроса 1
overmes
@overmes
потому что вы переписываете элемент который проверяете
array[j] = 'no'

после этого
array[j] === array[k]
будет работать не корректно

правильный вариант:
function getRepeatArray(array) {
	var newArr = [];

    for (var j = 0; j < array.length; j++) {
         var current = array[j];
        for (var k = j + 1; k < array.length; k++) {
            if (current === array[k]) {
                array[j] = 'no';
                array[k] = 'no';
            }
        }
    }	
}


++ j
это так модно теперь стало?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
KorsaR-ZN
@KorsaR-ZN
Ну конечно же работать будет не правильно, т.к Вы оперируете одним и тем же массивом, т.е когда первые две 4-ки заменяются на "no", и когда дело доходит до третей, то она уже ни с чем не совпадает...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы