Получить разницу между двумя массивами

#javascript

#javascript

Вопрос:

Мне нужно получить только разницу между двумя массивами

Я пытался:

 let arr1 = {
    "data": [{
        "id": "EID_Floss",
        "name": "Floss",
        "te": "dd"
    }]
}
let arr2 = {
    "data": [{
        "id": "EID_Floss",
        "name": "Floss"
    }]
}
JSON.stringify(arr2.data.filter((x) => !arr1.data.includes(x)))
 

Результат:

 [{
    "id": "EID_Floss",
    "name": "Floss"
}]
 

Как получить только это:

 [{
   "te": "dd"
}]
 

Комментарии:

1. Почему это arr1 не массив? Что, если data атрибуты имеют более одного элемента? Пожалуйста, будьте более подробны в своем вопросе.

2. Как вы определяете «разницу между двумя массивами»? Вы имеете в виду выбрасывать элементы одного массива, которых нет в другом?

3. Вы пытаетесь использовать разницу между отдельными объектами в массиве? Это по ключу или по ключу и значению?

4. Вы действительно хотите разницу между двумя массивами? Или вы хотите разницу между каждым объектом в массивах?

5. Обратите внимание, что arr1 и arr2 являются объектами , а не массивами. Давайте упростим ваш пример, чтобы он был просто массивами вместо ненужной сложной вложенности.

Ответ №1:

Посмотрите на этот более простой пример:

 


arr1 = ["foo", "bar"];
arr2 = ["foo", "bar", "foobar"];

arr3 = arr2.filter((x) => !arr1.includes(x));
console.log(arr3);
 Run code snippetHide resultsExpand snippet



 

Это делает именно то, что вы ожидаете, и результат:

[«foobar»]

Проблема с вашим примером заключается в том, что массивы в arr1.data и arr2.data содержат объекты. Вы сравниваете объект

 {
        "id": "EID_Floss",
        "name": "Floss",
        "te": "dd"
}
 

из arr1 с помощью объекта

 {
        "id": "EID_Floss",
        "name": "Floss"
}
 

От arr2 . Поскольку они не равны, ваш фильтр не удаляет объект из массива.

Обратите внимание, что это операция «все или ничего», поскольку вы фильтруете массив объектов. Вместо этого звучит так, как будто вы хотите отфильтровать ключи в каждом объекте. Поэтому вам нужно использовать Object.keys() или Object.values() для перебора содержимого объектов.