#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()
для перебора содержимого объектов.