Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.06.2015, 23:36
Новичок на форуме
Отправить личное сообщение для Winni Посмотреть профиль Найти все сообщения от Winni
 
Регистрация: 13.11.2014
Сообщений: 9

Объекты в массиве
Помогите разобраться в вопросе. Есть 2 массива из объектов (формат JSON). Один из массивов - обновлённая версия другого. Если конкретнее, то нужно сравнить старый и новый файл, и отобрать порядковые номера в новом массиве тех объектов, которых нет в старом. В объектах уникальным свойством является "id". Пример старого массива
[{"name":"Иван","id":"1234_SEPT_2014","country":"Москва"}, {"name":"Василий","id":"634_DES_2014","country":"Сочи"}]

И новый массив
[{"name":"Иван","id":"1234_SEPT_2014","country":"Москва"}, {"name":"Дмитрий","id":"4757_DES_2015","country":"Питер"}, {"name":"Василий","id":"634_DES_2014","country":"Сочи"}]

На выходе необходимо получить список с номерами элементов (объектов), которых нет в старом варианте. В данном случае [1]. Заранее спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 27.06.2015, 23:59
Новичок на форуме
Отправить личное сообщение для Winni Посмотреть профиль Найти все сообщения от Winni
 
Регистрация: 13.11.2014
Сообщений: 9

Точнее на выходе необходимо получить массив из объектов, которых нет в старом массиве.
Ответить с цитированием
  #3 (permalink)  
Старый 28.06.2015, 02:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Winni,
function fn(c, b) {
    for (var d = [], e = {}, a = 0; a < c.length; a++) e[c[a].id] = !0;
    for (a = 0; a < b.length; a++) !e[b[a].id] && d.push(b[a]);
    return d
};
var old = [{"name":"Иван","id":"1234_SEPT_2014","country":"Москва"}, {"name":"Василий","id":"634_DES_2014","country":"Сочи"}],
current = [{"name":"Иван","id":"1234_SEPT_2014","country":"Москва"}, {"name":"Дмитрий","id":"4757_DES_2015","country":"Питер"}, {"name":"Василий","id":"634_DES_2014","country":"Сочи"}];
 alert(JSON.stringify(fn(old, current)));
Ответить с цитированием
  #4 (permalink)  
Старый 28.06.2015, 14:16
Новичок на форуме
Отправить личное сообщение для Winni Посмотреть профиль Найти все сообщения от Winni
 
Регистрация: 13.11.2014
Сообщений: 9

Благодарю.
Ответить с цитированием
  #5 (permalink)  
Старый 30.06.2015, 14:45
Новичок на форуме
Отправить личное сообщение для Winni Посмотреть профиль Найти все сообщения от Winni
 
Регистрация: 13.11.2014
Сообщений: 9

рони, Подскажи, пожалуйста, ещё в таком моменте.
Допустим, есть массив
var array = [{"name":"Иван","friends":[{"name":"Дмитрий"},{"name":"Сергей"}]}]

Если я обращаюсь к несуществующему свойству объекта или несуществующему объекту, получаю undefined, например
console.log(array[0].country)
console.log(array[0].friends[3])

Но если я обращаюсь к свойству несуществующего объекта, то выполнение скрипта прерывается и получаю ошибку "Uncaught TypeError: Cannot read property 'image' of undefined", например
console.log(array[0].friends[3].image)

Как обойти эту ошибку и продолжить выполнение скрипта? Пробовал разного рода условия, не помогает
console.log(array[0].friends[3].image || 'def')

Последний раз редактировалось Winni, 30.06.2015 в 15:35.
Ответить с цитированием
  #6 (permalink)  
Старый 30.06.2015, 15:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Winni,
проверяют всю цепочку
var test = var[0] && var[0].friends && var[0].friends[3] && var[0].friends[3].image ? var[0].friends[3].image : 'def'
; примерно так
Ответить с цитированием
  #7 (permalink)  
Старый 30.06.2015, 15:37
Новичок на форуме
Отправить личное сообщение для Winni Посмотреть профиль Найти все сообщения от Winni
 
Регистрация: 13.11.2014
Сообщений: 9

Спасибо.
Ответить с цитированием
  #8 (permalink)  
Старый 01.07.2015, 20:18
Новичок на форуме
Отправить личное сообщение для Winni Посмотреть профиль Найти все сообщения от Winni
 
Регистрация: 13.11.2014
Сообщений: 9

Возможно ли с помощью цикла пройтись по всем объектам массива (пример ниже) и создать переменные (называться должны как свойство 'id'), присвоив им соответствующий объект.
[{"name":"Иван","id":"SEPT_2014","country":"Москва"}, {"name":"Василий","id":"DES_2015","country":"Сочи"}]

В результате должно получиться
var SEPT_2014 = {"name":"Иван","id":"SEPT_2014","country":"Москва"}
Ответить с цитированием
  #9 (permalink)  
Старый 01.07.2015, 20:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Winni,
можно но переменные будут глобальными
window[arr[i]["id"]]= arr[i]
Ответить с цитированием
  #10 (permalink)  
Старый 01.07.2015, 21:59
Новичок на форуме
Отправить личное сообщение для Winni Посмотреть профиль Найти все сообщения от Winni
 
Регистрация: 13.11.2014
Сообщений: 9

Спасибо. Как раз то, что нужно.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить объекты select D_Sergeevich Элементы интерфейса 3 16.09.2014 21:13
clone() клонирует копируемые объекты stella1982 jQuery 1 18.08.2014 08:28
Поиск объектов в массиве Lynatik Общие вопросы Javascript 24 22.06.2013 12:43
Поиск в массиве, частичное совпадение фонарик Общие вопросы Javascript 25 04.04.2013 07:43
Объекты в массиве. delias Общие вопросы Javascript 2 21.04.2010 22:28