Вопрос или проблема
Цель: Нужно найти uniqueArray
объектов из двух массивов объектов. uniqueArray
должен учитывать все изменения {key:value} в объектах.
При попытке проверить равенство постоянно получаю ложные положительные результаты.
Начальная точка: Два массива, содержащие объекты базы данных:
const old_workflow = [{a:1, b:2},{a:3,b:4}]
const new_workflow = [{a:1, b:2},{a:3,b:5}]
Идеальный результат:
uniqueArray должен содержать 1 копию каждого уникального объекта из обоих массивов
const uniqueArray = [{a:1, b:2},{a:3,b:4},{a:3,b:5}]
Попытки подходов: Я пробовал много, но ничего не сработало, вот два примера
#1
let concatArray = new_workflow.concat(old_workflow);
let uniqueArray = [...new Set(concatArray)];
Проблема #1: Я думал, что это цель Set()
, однако uniqueArray содержит дубликаты при визуальном просмотре
#2
const arrayUnique = (array: any) => {
let a = array.concat();
for (var i = 0; i < a.length; ++i) {
for (var j = i + 1; j < a.length; ++j) {
if (a[i] === a[j]) a.splice(j--, 1);
}
}
return a;
};
const uniqueArray = arrayUnique(new_workflow.concat(old_workflow));
Проблема #2: этот uniqueArray также содержит объекты с одинаковыми парами ключ:значение
Я думаю, что проблема в том, что объекты действительно уникальны друг от друга, независимо от свойств… так что…
Как я могу доказать или опровергнуть равенство объектов? Должен ли я пройти по каждому ключу?
Ответ или решение
Чтобы объединить два массива объектов и найти уникальные объекты с учётом их свойств и значений, нам нужно использовать стратегию, которая позволит корректно определить, являются ли две записи одинаковыми. Стандартное поведение JavaScript не позволяет сравнивать объекты напрямую, так как два объекта, даже если все их ключи и значения идентичны, считаются разными экземплярами.
Объединение Массивов и Поиск Уникальных Объектов
-
Определение проблемы: Основная задача состоит в том, чтобы создать массив, содержащий уникальные объекты из двух исходных массивов. Для этого необходимо сравнивать все свойства объектов.
-
Сравнение объектов: Мы будем использовать подход с созданием функции для глубокой проверки на равенство объектов. Если два объекта равны по всем свойствам и их значениям, мы будем считать их одинаковыми.
-
Использование JSON для упрощения: Один из способов лёгкого сравнения объектов – это преобразование их в строку JSON. Это позволяет легко сравнивать объекты, но имейте в виду, что данный метод не работает для объектов с функциями или когда порядок ключей имеет значение.
-
Код: Ниже представлен код на JavaScript, который реализует данную логику:
const old_workflow = [{a: 1, b: 2}, {a: 3, b: 4}];
const new_workflow = [{a: 1, b: 2}, {a: 3, b: 5}];
// Функция для проверки равенства двух объектов
function objectsAreEqual(obj1, obj2) {
return JSON.stringify(obj1) === JSON.stringify(obj2);
}
// Функция для получения уникального массива
function getUniqueObjects(arr1, arr2) {
const concatenatedArray = arr1.concat(arr2);
const uniqueArray = [];
concatenatedArray.forEach(currentObj => {
// Проверяем, существует ли уже этот объект в уникальном массиве
if (!uniqueArray.some(existingObj => objectsAreEqual(existingObj, currentObj))) {
uniqueArray.push(currentObj);
}
});
return uniqueArray;
}
// Получаем уникальные объекты из обоих массивов
const uniqueArray = getUniqueObjects(old_workflow, new_workflow);
console.log(uniqueArray);
Объяснение кода:
-
Функция
objectsAreEqual
: ИспользуетJSON.stringify
для сравнения двух объектов. Это упрощает процесс проверки их равенства. -
Функция
getUniqueObjects
:- Сначала объединяет два массива.
- Затем проходит по каждому объекту в объединённом массиве и проверяет, есть ли уже такой объект в массиве уникальных объектов.
- Если объекта нет, он добавляется в конечный массив.
Результат:
При выполнении приведённого кода, вы получите следующий результат:
const uniqueArray = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 3, b: 5}];
Такой подход решает вашу проблему, позволяя эффективно находить уникальные объекты из двух массивов, при этом учитывая изменения в значениях ключей.
Заключение
Использование JSON для сравнения объектов – это простое и эффективное решение данной задачи. Вы сможете легко адаптировать данный метод для более сложных структур данных, при необходимости дорабатывая функции сравнения в зависимости от специфики ваших объектов. Применяя такой подход, вы обеспечите эффективный и чистый код для работы с массивами объектов в JavaScript.