Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.10.2014, 19:52
Аватар для Armen
Кандидат Javascript-наук
Отправить личное сообщение для Armen Посмотреть профиль Найти все сообщения от Armen
 
Регистрация: 28.06.2009
Сообщений: 120

Как заменить все совпадения в массиве?
Здравствуйте, подскажите пожалуйста.
Есть код:
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 не заменился!
Почему так, не могу понять, если оберу одну четверку и оставлю две, то обе заменятся в независимости от того, какую именно четверку я уберу.
Может у кого-то есть свой вариант реализации подобного.
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 08.10.2014, 20:02
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 12,781

Сообщение от Armen
Почему так, не могу понять, если оберу одну четверку и оставлю две, то обе заменятся в независимости от того, какую именно четверку я уберу.
У тебя не будут заменяться любые совпадения более двух равных элементов.
Ты ведь сразу меняешь оригинал на no.
Ответить с цитированием
  #3 (permalink)  
Старый 08.10.2014, 20:02
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 2,928

Armen, потому что к тому времени, последнюю четвёрку уже не с чем сравнить, так как первая четвёрка уже заменена на "no". Как вариант, создать дубликат массива и сравнивать в нём, а значения "no" записывать в оригинальный массив.
Ответить с цитированием
  #4 (permalink)  
Старый 08.10.2014, 20:03
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 12,781

Сообщение от Ruslan_xDD
создать дубликат массива
Ух ё!
Ответить с цитированием
  #5 (permalink)  
Старый 08.10.2014, 20:08
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 2,928

ksa, ну ты понял.
Ответить с цитированием
  #6 (permalink)  
Старый 08.10.2014, 20:09
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 12,781

Сообщение от 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';
            };
        };
    };
};
Ответить с цитированием
  #7 (permalink)  
Старый 08.10.2014, 20:13
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 2,928

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);

Последний раз редактировалось ruslan_mart, 08.10.2014 в 20:17.
Ответить с цитированием
  #8 (permalink)  
Старый 08.10.2014, 20:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 28,891

вариант за 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
       }
   };
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заменить событие hover на событие загрузку страницы onLoad? SkyWay Общие вопросы Javascript 0 21.09.2014 15:06
Как сделать все содержимое страницы не активным son313 jQuery 9 10.07.2013 15:58
Как заменить всё содержимое страницы? AJAX/JQuery someone Общие вопросы Javascript 9 15.02.2013 14:19
Как правильно заменить подстроку. Ogara Общие вопросы Javascript 3 13.07.2012 02:12
Как найти индекс по элементу в двумерном массиве? bayah Общие вопросы Javascript 5 22.04.2010 15:26