Объединение двух массивов объектов для нахождения уникальных (не работает – используется filter, splice, Set и concat) [дубликат]

Вопрос или проблема

Цель: Нужно найти 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 не позволяет сравнивать объекты напрямую, так как два объекта, даже если все их ключи и значения идентичны, считаются разными экземплярами.

Объединение Массивов и Поиск Уникальных Объектов

  1. Определение проблемы: Основная задача состоит в том, чтобы создать массив, содержащий уникальные объекты из двух исходных массивов. Для этого необходимо сравнивать все свойства объектов.

  2. Сравнение объектов: Мы будем использовать подход с созданием функции для глубокой проверки на равенство объектов. Если два объекта равны по всем свойствам и их значениям, мы будем считать их одинаковыми.

  3. Использование JSON для упрощения: Один из способов лёгкого сравнения объектов – это преобразование их в строку JSON. Это позволяет легко сравнивать объекты, но имейте в виду, что данный метод не работает для объектов с функциями или когда порядок ключей имеет значение.

  4. Код: Ниже представлен код на 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.

Оцените материал
Добавить комментарий

Капча загружается...