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

Maxmaxmaximus4 09.12.2013 00:02

Знаешь как надо потестить? Используя эти преобразования из старого массива получить новый, у меня что-то не получается.

cyber 09.12.2013 00:04

Цитата:

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

Хз, я сонный немного, голова уже не варит.

Кстати тест, реально еврейский у меня он 3 раза показал 3к

Maxmaxmaximus4 09.12.2013 00:11

Твоя функция не справилась с этим

var oldArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var newArray = [1, 2, 3, 5, 34, 32, 4, 45];
var changes = compare(oldArray, newArray);

console.log(changes);

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

    for (var i = 0, index; i < oArr.length; i++) {
      index = search.indexOf(oArr[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
    }
}

cyber 09.12.2013 00:13

Цитата:

Сообщение от Maxmaxmaximus4
Знаешь как надо потестить? Используя эти преобразования из старого массива получить новый, у меня что-то не получается.

выбирать рандомно индексы и менять?
Как то так, писал прям в форме отправки (может не работать)
function genArr(count) {
   
    var arr = [];
    
    for(var i = 0; i < count; i++) {
     
      arr.push(i % 2 ? Math.random(): i);
    
    }
    
    return arr;
  
  }

var arr = genArr(100),
     arr2 = arr.slice();

for(var i = 0, index; i < 20; i++) {
index = Math.round(Math.random() * 100);
arr2[index] = i;

}

Maxmaxmaximus4 09.12.2013 00:18

var oldArray = [1, 2, 3, 4, 5];
var newArray = [1, 2, 3, 5, 4, 45];

вот с этим не справляется пишет что insert:[5] и все
он не видит разницы между 4,5 и 5,4 щам будем фиксить)

cyber 09.12.2013 00:20

Цитата:

Сообщение от Maxmaxmaximus4
Твоя функция не справилась с этим

я так и не понял где
"remove 5,6,7,8 insert 4,5,7 "

cyber 09.12.2013 00:20

Maxmaxmaximus4, ну вообще то она порядок не учитывает)

Maxmaxmaximus4 09.12.2013 00:36

cyber, уже учитывает, блять не против изредка помогать в написании великой и ужасной ui? ты гениален!!!! я серьезно!! я блять чо тока не придумал чтобы это сделать, да, мое было бы оптимальнее и "правильнее" но млять, кому оно науй надо если и так РАБОТАКЕТ и так МАЛО КОДУ, при чем не факт что мое было бы быстрее так как там несколько проходов и прочего, моя возвращала дамп который потом надо было бы парсить и делать по нему что-то, а твоя ГЕНИАЛЬНАЯ функция ТУПО ВОЗВРАЩАЕТ ПОРЯДОК ДЕЙСТВИЙ КОТОРЫЕ НАДО СДЕЛАТЬ ЧТОБЫ ПОЛУЧИТЬ ИЗ ОДНОГО МАССИВА ДРУГОЙ)!!!!! ЭТО ТО-ЧТО-НУЖНО!! Ты гениален! Правда!

вот кстати исправленная версия:

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

    for (var i = 0, index; i < oArr.length; i++) {
      index = search.indexOf(oArr[i], 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
    }
  }

cyber 09.12.2013 00:42

Maxmaxmaximus4,
лови, теперь с блэкджеком и replace
Array.prototype.compare = function(arr) {
    
    var search = arr.slice(),
        insert = [],
        remove = [],
        replace = [];
    
    for(var i = 0, index; i < this.length; i++) {
        
        index = search.indexOf(this[i]);

		if(!~index) {
          
			remove.push(i);
            continue;
        }
        
      	i != index && replace.push({old: i, new: index});
        
        delete search[index];

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


console.log([1, 2, 3, 4, 5].compare([1, 2, 3, 5, 4, 45]));

Maxmaxmaximus4 09.12.2013 00:56

Цитата:

Сообщение от cyber
лови, теперь с блэкджеком и replace

ща потестим)


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