Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.12.2017, 11:03
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сравнение массивов
Здравствуйте, есть два массива, такого вида:
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 не желательно).

До этого просто каждый раз присваивал массив, но это не подходит
Ответить с цитированием
  #2 (permalink)  
Старый 13.12.2017, 11:08
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

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;
});

Последний раз редактировалось Nexus, 13.12.2017 в 16:26.
Ответить с цитированием
  #3 (permalink)  
Старый 13.12.2017, 12:28
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

shoopik,
а каждый последующий раз приходит весь массив целиком, или только те пункты, которые поменялись? Могут ли приходить новые пункты, с теми id, которых ещё не было? Могут ли удаляться пункты?
Ответить с цитированием
  #4 (permalink)  
Старый 13.12.2017, 16:08
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от Alexandroppolus Посмотреть сообщение
shoopik,
а каждый последующий раз приходит весь массив целиком, или только те пункты, которые поменялись? Могут ли приходить новые пункты, с теми id, которых ещё не было? Могут ли удаляться пункты?

каждый раз весь массив целиком, могут приходить те, которых не было, пункты(водители) могут удаляться
Ответить с цитированием
  #5 (permalink)  
Старый 13.12.2017, 16:10
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от Nexus Посмотреть сообщение
shoopik, в цикле пробежаться по массиву не пробовали?
var data,//Текущие данные
	new_data,//Новые данные
	indexed_data={};//id=>item
	
new_data.forEach(function(item){
	indexed_data[item.id]=item;
});
data.map(function(item){
	var new_item=indexed_data[item.id]||item;
	
	['latitude','longitude'].forEach(function(key){
		if(item[key]!=new_item[key])
			item[key]=new_item[key];
	});
	
	return item;
});
спасибо, попробую. вопрос как удалить тех, кого нету)
Ответить с цитированием
  #6 (permalink)  
Старый 13.12.2017, 16:26
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

shoopik, изменил пост №2
Ответить с цитированием
  #7 (permalink)  
Старый 13.12.2017, 17:13
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от shoopik
каждый раз весь массив целиком
тогда почему бы просто не заменять старый на новый?
или тебе надо отследить изменения?
Ответить с цитированием
  #8 (permalink)  
Старый 13.12.2017, 18:29
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от Nexus Посмотреть сообщение
shoopik, в цикле пробежаться по массиву не пробовали?
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;
});
Получается здесь всё равно идёт присвоение, ну т.е. на место старого массива, встаёт копия. Старый же заменяется ?
Ответить с цитированием
  #9 (permalink)  
Старый 13.12.2017, 18:31
Аспирант
Отправить личное сообщение для shoopik Посмотреть профиль Найти все сообщения от shoopik
 
Регистрация: 02.07.2017
Сообщений: 83

Сообщение от Alexandroppolus Посмотреть сообщение
тогда почему бы просто не заменять старый на новый?
или тебе надо отследить изменения?
Ну там особенность такая, плавнее изменяется, и окошко над меткой не исчезает, если менять координаты, а не полностью перезаписывать массив.
Ответить с цитированием
  #10 (permalink)  
Старый 13.12.2017, 18:48
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

shoopik,
Сообщение от shoopik
Получается здесь всё равно идёт присвоение
Вы можете по условию if(item[key]!=old_item[key])
делать не только присвоение, а и запустить функцию изменения координат
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение значений массивов в мини-игре Cubbat Общие вопросы Javascript 1 18.10.2016 05:25
сравнение элементов массивов cajiamahdpa Общие вопросы Javascript 1 17.10.2016 11:29
Сравнение 2 массивов в each Vladislav306907 jQuery 1 23.06.2016 01:10
Сравнение элементов массивов nesfiraty Общие вопросы Javascript 20 13.01.2015 19:23
сравнение массивов bot87 Общие вопросы Javascript 4 22.09.2012 01:31