Сравнение массивов
Здравствуйте, есть два массива, такого вида:
0:
{id: "driver_socket_1", latitude: -11.37080786775757, longitude: -27.69586199177322, iconUrl: "assets/carIcon.png"}
1:
{id: "driver_socket_2", latitude: -28.24136677583389, longitude: -10.25425740195638, iconUrl: "assets/carIcon.png"}
2:
{id: "driver_socket_3", latitude: -40.95439940439371, longitude: -27.673982748204622, iconUrl: "assets/carIcon.png"}
3:
{id: "driver_socket_4", latitude: -22.490445128116, longitude: 9.730743699541932, iconUrl: "assets/carIcon.png"}
4:
{id: "driver_socket_5", latitude: -8.14232867010616, longitude: -5.386359633011523, iconUrl: "assets/carIcon.png"}
Первый массив пустой, второй приходит с сервера. Первый раз когда приходит, присваиваю второй массив к первому. Но вот потом, каждый раз когда приходит, нужно сравнить локальный массив и с сервера, если координаты меняются, нужно изменить именно их. Вопрос как сравнить два массива и если координаты отличаются, поменять их, не обязательно чистый жс, можно лодаш ( jquery не желательно). До этого просто каждый раз присваивал массив, но это не подходит :) |
shoopik, в цикле пробежаться по массиву не пробовали?
var data,//Текущие данные
new_data,//Новые данные
indexed_data={};//id=>item
data.forEach(function(item){
indexed_data[item.id]=item;
});
data=new_data.map(function(item){
var old_item=indexed_data[item.id]||false;
if(!old_item)//Is new item
return item;
['latitude','longitude'].forEach(function(key){//Update fields
if(item[key]!=old_item[key])
old_item[key]=item[key];
});
return old_item;
});
|
shoopik,
а каждый последующий раз приходит весь массив целиком, или только те пункты, которые поменялись? Могут ли приходить новые пункты, с теми id, которых ещё не было? Могут ли удаляться пункты? |
Цитата:
каждый раз весь массив целиком, могут приходить те, которых не было, пункты(водители) могут удаляться :) |
Цитата:
|
shoopik, изменил пост №2
|
Цитата:
или тебе надо отследить изменения? |
Цитата:
|
Цитата:
|
shoopik,
Цитата:
делать не только присвоение, а и запустить функцию изменения координат |
Цитата:
|
Цитата:
|
Цитата:
|
shoopik, даже не знаю.
Достаточно просто разобраться, что скрипт делает. Из массива new_data создается новый массив data, который содержит как новые элементы из массива new_data, так и измененные элементы массива data, если в массивах data и new_data были элементы с одинаковыми id. |
Цитата:
|
shoopik, массив фактически другой, но элементы - измененные старые, к которым добавились новые.
Так что можно сказать, что это старый массив, который подвергся изменению. Какой-то разницы быть не может, если данные хранятся в обычном массиве. |
shoopik,
Вы лучше конкретизируйте, какой результат вам нужен в итоге - что, где и по какой причине должно меняться. Каким образом, на основании чего идет перерисовка? |
Судя по посту №9 в этом топике, автору нужен "виртуальный ДОМ" или типа того.
|
Цитата:
Зачем это всё ? Т.е. при отрисовке, если подменять массив, то если выбран(выделен, захвачен) какой-то отрисованный объект, он пропадает из выделения, нужно менять именно в старом |
shoopik,
Еще раз: Каким образом, на основании чего идет перерисовка? |
Без переформирования, чистое переприсвоение значений при различии.
Различие в первой и последней строках массивов. С удалением отсутствующих в новом массиве. С добавлением новых в старый массив.
var data = [{id: "driver_socket_1", latitude: -11.37080786775757, longitude: -27.69586199177322, iconUrl: "assets/carIcon.png"},
{id: "driver_socket_2", latitude: -28.24136677583389, longitude: -10.25425740195638, iconUrl: "assets/carIcon.png"},
{id: "driver_socket_3", latitude: -40.95439940439371, longitude: -27.673982748204622, iconUrl: "assets/carIcon.png"},
{id: "driver_socket_4", latitude: -22.490445128116, longitude: 9.730743699541932, iconUrl: "assets/carIcon.png"},
{id: "driver_socket_5", latitude: -8.14232867010616, longitude: -5.386359633011523, iconUrl: "assets/carIcon.png"}],
new_data = [{id: "driver_socket_1", latitude: -10.37080786775757, longitude: -28.69586199177322, iconUrl: "assets/carIcon.png"},
{id: "driver_socket_2", latitude: -28.24136677583389, longitude: -10.25425740195638, iconUrl: "assets/carIcon.png"},
{id: "driver_socket_4", latitude: -22.490445128116, longitude: 9.730743699541932, iconUrl: "assets/carIcon.png"},
{id: "driver_socket_5", latitude: -7.14232867010616, longitude: -5.386359633011523, iconUrl: "assets/carIcon.png"},
{id: "driver_socket_6", latitude: -6.14232867010616, longitude: -6.386359633011523, iconUrl: "assets/carIcon.png"}],
indexed_data={};//id=>item
new_data.forEach(function(item){
indexed_data[item.id]=item;
});
data.forEach(function(item, index){
var new_item=indexed_data[item.id];
if(new_item) {
delete indexed_data[item.id];
['latitude','longitude'].forEach(function(key){
if(item[key]!=new_item[key])
item[key]=new_item[key];
});
} else {
delete data[index];
}
});
for(var key in indexed_data) {
data.push(indexed_data[key]);
};
alert(JSON.stringify(data));
|
Цитата:
Спасибо, почти то что нужно )) Только, если в new_data есть элементы, которых нету в data, они тоже должны пушиться |
shoopik,
Цитата:
Исправил вычеркивание из старого массива и дописал добавление нового в примере пост№21 |
| Часовой пояс GMT +3, время: 22:12. |