Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как заменить все совпадения в массиве? (https://javascript.ru/forum/misc/50719-kak-zamenit-vse-sovpadeniya-v-massive.html)

Armen 08.10.2014 20:52

Как заменить все совпадения в массиве?
 
Здравствуйте, подскажите пожалуйста.
Есть код:
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 не заменился!
Почему так, не могу понять, если оберу одну четверку и оставлю две, то обе заменятся в независимости от того, какую именно четверку я уберу.
Может у кого-то есть свой вариант реализации подобного.
Спасибо.

ksa 08.10.2014 21:02

Цитата:

Сообщение от Armen
Почему так, не могу понять, если оберу одну четверку и оставлю две, то обе заменятся в независимости от того, какую именно четверку я уберу.

У тебя не будут заменяться любые совпадения более двух равных элементов.
Ты ведь сразу меняешь оригинал на no. ;)

ruslan_mart 08.10.2014 21:02

Armen, потому что к тому времени, последнюю четвёрку уже не с чем сравнить, так как первая четвёрка уже заменена на "no". Как вариант, создать дубликат массива и сравнивать в нём, а значения "no" записывать в оригинальный массив.

ksa 08.10.2014 21:03

Цитата:

Сообщение от Ruslan_xDD
создать дубликат массива

Ух ё! :blink:

ruslan_mart 08.10.2014 21:08

ksa, ну ты понял. :D

ksa 08.10.2014 21:09

Цитата:

Сообщение от Armen
Может у кого-то есть свой вариант реализации подобного.

Как вариант...

var arr2 = ['0', '1', '2', '3', '4', '5', '4', '7', '8', '9', '4', '11'];
getRepeatArray(arr2);
alert(arr2);
function getRepeatArray(array) {
    for (var j = 0; j < array.length; ++ j) {
        var val=array[j];
		if (val=='no') {
			continue;
		}	
        for (var k = j + 1; k < array.length; ++ k) {
            if (val === array[k]) {
                array[j] = 'no';
                array[k] = 'no';
            };
        };
    };
};

ruslan_mart 08.10.2014 21:13

var arr2 = ['0', '1', '2', '3', '4', '5', '4', '7', '8', '9', '4', '11'];

function getRepeatArray(array) {
    var newArr = [].concat(array);
    for(var k, j = 0; j < array.length; ++j) {
        for(k = j + 1; k < array.length; ++k) {
            if(newArr[j] == newArr[k]) array[k] = array[j] = 'no';
        }
    }
    alert(array);
}

getRepeatArray(arr2);

рони 08.10.2014 21:54

:) вариант за 1 цикл ...
var arr2 = ['0', '1', '2', '3', '4', '5', '4', '7', '8', '9', '4', '11'];
   getRepeatArray(arr2);
   alert(arr2);

   function getRepeatArray(b) {
       for (var c = {}, a = 0; a < b.length; a++) {
           var d = b[a],
               e = c[d];
           null != e ? (b[a] = "no", b[e] = "no") : c[d] = a
       }
   };


Часовой пояс GMT +3, время: 05:00.