Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как найти различие между двумя массивами? (https://javascript.ru/forum/offtopic/43511-kak-najjti-razlichie-mezhdu-dvumya-massivami.html)

Maxmaxmaximus4 08.12.2013 22:39

cyber, слушай, ну она даже не справляется с этим
var arr1 = [3, 3, 3, 3, 3];
var arr2 = [3, 3, 11, 3, 3];

и с этим

var arr1 = [3, 3, 3, 3, 3];
var arr2 = [3, 3, 3, 3, 11];

cyber 08.12.2013 22:45

Maxmaxmaximus4, так либо ты наркомана, либо я.
Array.prototype.compare = function(arr) {
    
    var search = arr.slice(),
        insert = [],
        remove = [];
    
    for(var i = 0, index; i < this.length; i++) {
        
        index = search.indexOf(this[i]);

		if(!~index) {
          
			remove.push(i);
            
            continue;
        }
        
        delete search[index];

	};
    
    search.forEach(function (elem, i) {
        if(elem)
          insert.push(i);     
    });
    
    return {
        remove: remove,
        insert: insert
    }
    
}

//console.log([1,2,3,4].compare([2,3,4,5, 34, 2 , 3434]));

console.log([3, 3, 3, 3, 3].compare([3, 3, 11, 3, 3]));

код вернет
insert: [2] // элемент с индексом 2 из нового массива нужно вставить
remove: [4] // элемент с индексом 4 из старого массива нужно удалить

Maxmaxmaximus4 08.12.2013 23:03

cyber, походу я наркоман, я забыл что ты replace не сделал. щас добавлю replase в твою реализацию и посмотрим как фурычит. но пока, я должен признаться, я охренел) так просто вроде все сделал. если честно я вообще в ахуе, не верится что оно работает)

Maxmaxmaximus4 08.12.2013 23:22

к слову, вот здесь он должен выдать

var oldArray = [1, 2, 2, 200, 6, 6];
var newArray = [1, 2, 2, 200, 200, 6];

replaсe:[4],
remove:[],
insert:[]

задача то кратчайшее преобразование найти

Maxmaxmaximus4 08.12.2013 23:30

Давай подумаем как в эту реализацию можно добавить replace?

я тут слегка отрефакторил

Array.prototype.compare = function(arr) {
    var search = arr.slice();
    var insert = [];
    var remove = [];

    for (var i = 0, index; i < this.length; i++) {
      index = search.indexOf(this[i]);
      if (index < 0) remove.push(i);
      else delete search[index];
    }

    for (var i = 0; i < search.length; i++) {
      if (i in search) insert.push(i);
    }

    return {
      remove: remove,
      insert: insert
    }
}


по уму, взять и посмотреть где в remove и insert есть одинаковые элементы, это ознчает что там происходит удаление и вставка, то есть замена =) но нет, не всегда замены детектируется так, щас поищу я когда тестировал её там было пару случаев когда индексы разные были, если изменения происходили на коцне массива.

cyber 08.12.2013 23:47

Maxmaxmaximus4, лучше ищи нормальный вариант, так как мой работает слишком медленно даже для сравнения массива из 100 элементов.
http://learn.javascript.ru/play/7rjdL

Maxmaxmaximus4 08.12.2013 23:47

я обьясню почему, просто это тут у нас ладно li, а вдруг у нас там в этом li целые контроллеры и куча детей это допустим сообщения в чате и они сложные там стока разметки в каждом и.т.п. не хотелось бы ПРОСТО ТАК удалять одно и заменять другим, дело в том что ui изменения то автоматически перерисовывает. ладно я думаю это мелочи, вообще ты гений блин) это то что нужно! СПАСИБО! Я даже показывать не буду какого монстра Я напилил)

Цитата:

Сообщение от cyber
так как мой работает слишком медленно

он будет вызываться только если обсервер обнаружит изменения в массиве=) так что это не страшно, это миллисекунды, они КУДА быстрее чем вставка и перерисовка DOM

cyber 08.12.2013 23:49

Maxmaxmaximus4, хотя, тест какой то кривой, щас проверю скорость выполнения и скажу)

Maxmaxmaximus4 08.12.2013 23:54

cyber, кстати зачем ты ставишь такое ядерное количество красных строк там где они по смыслу не нужны? они же теряют свою ценность так и когда они ВЕЗДЕ, настоящие красные строки не заметны =)



шо-то с тестом явно не так

cyber 09.12.2013 00:00

Цитата:

Сообщение от Maxmaxmaximus4
cyber, кстати зачем ты ставишь такое ядерное количество красных строк там где они по смыслу не нужны? они же теряют свою ценность так и когда они ВЕЗДЕ, настоящие красные строки не заметны =)

мне так читать свой код легче потом)


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