#javascript #arrays
#javascript #массивы
Вопрос:
Я пытаюсь создать новый массив объектов, сравнивая 2 существующих. Я хочу возвращать только элементы, которые передают оператор if.
Я хочу, чтобы это произошло: если имя элемента из addedArray совпадает с именем элемента из MainArray, А «добавленные» значения совпадают, затем верните элемент в новый массив, ИЛИ, если имена элементов не совпадают, добавьте элемент в новый массив в любом случае.
Если это не имеет смысла, пожалуйста, посмотрите на результат, который я хочу.
Вот что у меня есть прямо сейчас, и по какой-то причине в новом массиве все еще есть все элементы addedArray. Я не понимаю, почему.
const mainArray = [
{name: 'item1', added: false},
{name: 'item2', added: true},
{name: 'item3', added: false}
]
const addedArray = [
{name: 'item2', added: true},
{name: 'item3', added: true},
{name: 'item5', added: true}
]
let newAddedArray = addedArray.filter((addedItem) => {
return mainArray.map((mainItem) => {
if ((addedItem.name === mainItem.name amp;amp; addedItem.added === mainItem.added) || addedItem.name !== mainItem.name) {
return {
...addedItem,
addedItem
}
}
})
})
// Result I want
// newAddedArray = [
// {name: 'item2', added: true},
// {name: 'item5', added: true}
// ]
console.log(newAddedArray)
Ответ №1:
Второе условие в OR выполняется для всех элементов в addedArray. Итак, вы видите все элементы в своем результате.
Из ожидаемого результата ясно, что вы пытаетесь пропустить любой элемент из MainArray, который имеет «добавленное» значение, не сравнимое с значением в addedArray. Попробуйте следующее
addedArray.filter(function(addedItem){
const itemFromMain = mainArray.find(function(mainItem){
return mainItem.name === addedItem.name;
});
// If mainItem is found and 'added' matches or if mainItem is not found, accept it
if(!itemFromMain || (itemFromMain amp;amp; itemFromMain.added === addedItem.added)) return true;
return false;
});
Пожалуйста, обратите внимание, что метод «find» для массива не поддерживается в IE.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
Редактировать: вы также можете использовать это условие для упрощения
if(itemFromMain amp;amp; itemFromMain.added !== addedItem.added) return false;
return true;
Ответ №2:
Попробуйте, как показано ниже,
let newAddedArray = [];
mainArray.forEach((main) => {
newAddedArray = addedArray.filter((added) => {
return ((added.name === main.name amp;amp; added.added === main.added) || added.name !== main.name);
});
});
Ответ №3:
Вы можете использовать array .some
для этого, изменив свою функцию фильтра:
const mainArray = [
{name: 'item1', added: false},
{name: 'item2', added: true},
{name: 'item3', added: false}
]
const addedArray = [
{name: 'item2', added: true},
{name: 'item3', added: true},
{name: 'item5', added: true}
]
let newAddedArray = addedArray.filter(item => {
const { name, added } = item;
return mainArray.some(arr => arr.added amp;amp; added amp;amp; arr.name == name) ||
!mainArray.some(arr => arr.name === name)
})
console.log(newAddedArray)