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 01:04

cyber, чувак, сделай фикс уже search.indexOf(this[i], i);

cyber 09.12.2013 01:08

Цитата:

Сообщение от Maxmaxmaximus4
cyber, чувак, сделай фикс уже search.indexOf(this[i], i);

Эм, понял о чем ты, я не увидел)

cyber 09.12.2013 01:20

Maxmaxmaximus4, ну тогда в общем replace не нужен:)

Maxmaxmaximus4 09.12.2013 01:36

Цитата:

Сообщение от cyber
ну тогда в общем replace не нужен

МНЕ - нужен, ну то есть собрать из старого массива новый используя только ремувы и инсерты я уже могу, реплейс это оптимизация, щас сижу добавляю его (реплейс это просто индексы значение которых надо поменять)

как ты вообще этот алгоритм придумал????????????????????????? сколько времени заняло? делал ли что-то подобное до этого? не ну, то есть , алгоритм то конечно тупой и брутальный, но РАБОТАЕТ ЖЕ)

cyber 09.12.2013 01:40

Maxmaxmaximus4, когда курсовую писал, нужно было сравнить 2 массива с изображениями что бы не перезагружать все, а разбираться с готовыми алгоритмами было влом поэтому сделал "в лоб".

Maxmaxmaximus4 09.12.2013 01:45

cyber, не ну, то есть , алгоритм то конечно тупой и брутальный, но РАБОТАЕТ ЖЕ) спасибо огромное

l-liava-l 09.12.2013 02:41

Ихих ребят вы чо, сравнение массивов по 2000 элементов из за парочки изменений это тоже не круто.

Цитата:

Конечно кто-то из вас скажет - просто сделай обертки на методы массива такие как pop push unshift и.т.п. и смотри как они вызываются и запоминай это, но я считчаю это костылем при чем грубым.
Можно же не переопределять свойства Array.prototype, а сделать другой обьект, который будет перекрывать эти свойства для твоих sсope обьектов. Вреда вообще никакого, и считаться будет быстрее)

Maxmaxmaximus4 09.12.2013 02:57

Цитата:

Сообщение от l-liava-l
Можно же не переопределять свойства Array.prototype, а сделать другой обьект, который будет перекрывать эти свойства для твоих sсope обьектов. Вреда вообще никакого, и считаться будет быстрее)

Не ну так я про то и говорю, ну перекрыли мы а человек новый аррей добавил, а что если этот новый аррей на 80% похож на старый? а что если человек использовал свои кастомные методы работы с массивом?
а что если человек через цикл for массив изменял? а что если концатенацией делал? вот и я про то)

Maxmaxmaximus4 09.12.2013 03:13

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

var changes = compare(oldArray, newArray);
console.log(changes);


// превратим старый аррей в новый используя полученные данные

// удаляем (в обратном порядке чтобы индексы не смещались)
for (var i = changes.remove.length - 1; i >= 0; i--) {
  var index = changes.remove[i];
  oldArray.splice(index, 1);
}
// добавляем
for (var i = 0; i < changes.insert.length; i++) {
  var index = changes.insert[i];
  oldArray.splice(index, 0, newArray[index])
}
// изменяем
for (var i = 0; i < changes.replace.length; i++) {
  var index = changes.replace[i];
  oldArray[index] = newArray[index];
}

// отобразим результат, старый и новый массивы теперь равны
console.log(newArray);
console.log(oldArray);



// наща мега функция
function compare(oArr, arr) {
  var search = arr.slice();
  var changes = {
    insert : [],
    remove : [],
    replace: []
  }

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

  for (var i = 0; i < search.length; i++) if (i in search) {
    var index = changes.remove.indexOf(i);
    if (index < 0) changes.insert.push(i);
    else {
      changes.remove.splice(index, 1);
      changes.replace.push(i)
    }
  }
  
  return changes
}

l-liava-l 09.12.2013 03:23

Цитата:

Не ну так я про то и говорю, ну перекрыли мы а человек новый аррей добавил, а что если этот новый аррей на 80% похож на старый? а что если человек использовал свои кастомные методы работы с массивом?
а что если человек через цикл for массив изменял? а что если концатенацией делал? вот и я про то)
А если не добавил? зачем тогда сравнивать столько элементов? Может запилить что то гибридное.


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