Задать вопрос
@nak-alexey

Как определить, есть ли различия в массивах объектов?

Имеются массивы объектов, например:

let array1 = [{name: "Игорь"}, {name: "Владимир"}, {name: "Сергей"}],
    array2 = [{name: "Игорь"}, {name: "Владимир"}, {name: "Валентин"}, {name: "Светлана"}];

Как определить, есть ли различия в объектах?
  • Вопрос задан
  • 190 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
function diff(data1, data2, key = n => n) {
  const getKey = key instanceof Function ? key : n => n[key];
  const keys = new Set(Array.from(data2, getKey));
  return Array.prototype.filter.call(data1, n => !keys.has(getKey(n)));
}

// ваш случай
diff(array1, array2, 'name')

// есть и другие варианты применения
diff([ 1, 2, 3, 4, 5 ], [ 1, 2, 3 ]) // [4, 5]
diff('abcde', 'ACE', n => n.toLowerCase()) // ['b', 'd']
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
erge
@erge
Примус починяю
Вариант @pterodaktil
let merged = [...array1, ...array2].map(i => i.name);

if (new Set(merged).size === merged.length/2) {
  // равны
} else {
  // не равны
}


Так же если объекты более сложно-структурированные, но имеют строгий порядок в структуре, то можно так попробовать
if (JSON.stringify(obj1) === JSON.stringify(obj2)) {
  // равны
} else {
  // не равны
}
Ответ написан
Комментировать
@SkibaAnton
Frontend-Developer
Тут важно понимать, какие именно различия вас интересуют? Можно написать целую функцию с кучей проверок на длины массивов, структуру объектов, на порядок объектов, так что не ясно что именно вы хотите получить. Если просто равенство, то самый простой способ перевести их в строки с помощью JSON.stringify
function isEqual(arr1, arr2) {
	return JSON.stringify(arr1) === JSON.stringify(arr2);
}

Но этот метод делает разные неявные приколы с вложенными объектами и функциями в объектах
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы