|
Как найти различие между двумя массивами?
Нужно замутить что-то наподобие гита. Чтобы функция смотрела различия между массивами и возвращала примерно такой обьект:
var oldArr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var newArr = [1, 2, 5, 6, 7, 10, 10, 8, 9];
var differences = {
removed : [2, 3],
inserted: [5, 6],
changed : []
}
У кого есть какие идеи? |
Цитата:
Если нужна транспозиция, то Дамерау — Левенштейна. |
Ушел гуглить, спасибо, а то я уже свой алгоритм мутить начал. Кстати вопрос, оно вообще быстрое? Это мне нужно для оптимизации repeat'ера чтобы если у нас 2000 элементов то и новый добавляется вначале то он не вставлял новый dom в конец а все предыдущие перерендеривал, а тупо вставил dom вначало )
|
Цитата:
|
Цитата:
Цитата:
|
походу зря я делал в "лоб")
Пошел читать про "расстояния Левенштейна"
imageLoader.prototype._compare = function(images) {
images = images[this._activeCategory];
var imgList = this.ImageList[this._activeCategory],
leng = Math.max(images.length, imgList.length);
for(var i = 0; i < leng; i++) {
if(imgList[i] &&
!~images.indexOf(imgList[i])) {
this._removeImage(imgList[i]);
}
if(images[i] &&
!~imgList.indexOf(images[i])) {
this._createImage(images[i]);
}
};
return this;
};
|
Цитата:
мы хотим повторить li столько раз сколько элементов в массиве и значение каждого элемента засовывать в scope.item и она будет рисоваться в элементе. Для этого мы создаем scope для каждого li. И делаем такие пары scope+li столько раз сколько элементов в массиве. Потом пробегаемся по созданным скоупам и добавляем туда в scope.item соответствующее значение массива. Суть в том что перерисовка {в таких тегах} дорогая операция. Если у нас массив [1,2,3,4], то разметка будет такой: <li> {item}</li> <li> {item}</li> <li> {item}</li> <li> {item}</li> и при рендеринге в {теги} подставятся значения <li> 1</li> <li> 2</li> <li> 3</li> <li> 4</li> потом человек делает arr.unshift(0); массив становится такой [0, 1,2,3,4], и мой текущий алгоритм посмотрит, увидит что длинна изменилась и стала больше, добавит один li в конец того списка li, снова пробежится по всем скоупам и установит им соответствующие значения массива. суть тут в том что по сути новый элемент массива мы добавили в начало массива, а li добавили в конец. И все значения сместились ка бы вниз, и требуется перерисовка всех элементов, понятно почему? Ну вот, а все потому что алгоритм тупой, и не знает ГДЕ ИМЕННО добавились данынне а где удалились, и я хочу это узнавать. Представим что у нас 2000 элементов и мы добавили в начало массива одно значение, html элемент добавится в конец, а все 2000 элементов перерисуются в соответствии с новыми сместившимися значениями, это очень не оптимально. Конечно кто-то из вас скажет - просто сделай обертки на методы массива такие как pop push unshift и.т.п. и смотри как они вызываются и запоминай это, но я считчаю это костылем при чем грубым. |
Maxmaxmaximus4, а не проще не давать прямой доступ к массиву ?
А сделать к примеру методы Add, Remove, Edit, это будет оптимальнее сравнения 2х массивов. |
Нет, человек работает только с данными и ничего не должен знать о том как они привязываются к DOM. В этом то и прелесть =)
<li repeat="item in arr">{item}</li>
function Ctrl() {
arr = [1, 2, 3, 4, 5] //челоевк работает только с этим
arr = [10] //захочет, вообще новый массив засунет, и DOM должен все это отражать
}
monolithed, щас я короче свой алгоритм запилю) посмотрим чо выйдет. |
Цитата:
Грубо говоря у него есть два массива, ему надо пробежаться циклом по одному и проверить наличие этого элемента в другом. Я сейчас не принимаю во внимание, что элементом массива может быть массив или объект. К слову, объекты придется сравнивать по значению (как и массивы). 1. Идешь циклом по новому массиву 2. Смотришь, если ли такой элемент в старом массиве 3. Если есть и в той же позиции, идешь дальше 4. Если нет, добавляешь 5. Если отличается позиция перемещаешь 6. Останется отсечь элементы кот. остались в старом массиве, но нет в новом На первый взгляд можно сделать за один проход по новому массиву (с доп. массивами индексов). Могу ошибаться. upd: в пыхе, кстати есть http://php.net/manual/ru/function.levenshtein.php и http://www.php.net/manual/ru/function.similar-text.php upd2: А вот левенштейн на js |
| Часовой пояс GMT +3, время: 01:06. |
|