如何比较两个对象数组,并仅从第一个数组中删除项目(如果第二个数组的项目值是这样的话)



我正试图通过比较两个现有对象来创建一个新的对象数组。我只想返回通过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 && 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)

OR中的第二个条件用于addedArray中的所有项。所以,你看到了结果中的所有项目。

从您预期的结果来看,很明显,您正试图跳过mainArray中任何具有与addedArray中的值不匹配的"added"值的项。尝试以下

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 && itemFromMain.added === addedItem.added)) return true;
return false;
});

请注意;查找";IE不支持Array上的方法。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

编辑:您也可以使用此条件来简化

if(itemFromMain && itemFromMain.added !== addedItem.added) return false;
return true;

试试下面的

let newAddedArray = [];
mainArray.forEach((main) => {
newAddedArray = addedArray.filter((added) => {
return ((added.name === main.name && added.added === main.added) || added.name !== main.name);
});
});

您可以使用数组.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 && added && arr.name == name) || 
!mainArray.some(arr => arr.name === name)
})
console.log(newAddedArray)

相关内容

最新更新