根据特定属性值匹配的另一个对象数组删除数组中的对象



我有两个数组(如下)-我想修改relatedCards数组,不包括ownedCards数组中存在的对象,其中relatedCards.seriesownedCards.series的值相同,relatedCards.card_numberownedCards.card_number也相同。

let relatedCards = [
{
"brand":"National Treasures",
"card_number":"43",
"manufacturer":"Panini",
"series":"Rookie Patch Autographs",
"year":"2017"
},
{
"brand":"National Treasures",
"card_number":"4",
"manufacturer":"Panini",
"series":"2014 National Notable Nicknames",
"year":"2017"
},
{
"brand":"National Treasures",
"card_number":"99",
"manufacturer":"Panini",
"series":"Collegiate Materials Signatures Silver",
"year":"2017"
},
{
"brand":"National Treasures",
"card_number":"199",
"manufacturer":"Panini",
"series":"Collegiate Materials Signatures Silver",
"year":"2017"
}
]

let ownedCards = [
{
"brand":"National Treasures",
"card_number":"43",
"manufacturer":"Panini",
"series":"Rookie Patch Autographs",
"year":"2017"
},
{
"brand":"National Treasures",
"card_number":"4",
"manufacturer":"Panini",
"series":"2014 National Notable Nicknames",
"year":"2017"
},
{
"brand":"National Treasures",
"card_number":"411",
"manufacturer":"Panini",
"series":"Collegiate Materials",
"year":"2017"
}
]

根据上面两个数组,新数组的输出应该是

[   
{
"brand":"National Treasures",
"card_number":"99",
"manufacturer":"Panini",
"series":"Collegiate Materials Signatures Silver",
"year":"2017"
},
{
"brand":"National Treasures",
"card_number":"199",
"manufacturer":"Panini",
"series":"Collegiate Materials Signatures Silver",
"year":"2017"
}
]

实现这一目标的最有效方法是什么?

最简单的方法是使用filtersome

let relatedCards = [ { "brand":"National Treasures", "card_number":"43", "manufacturer":"Panini", "series":"Rookie Patch Autographs", "year":"2017" }, { "brand":"National Treasures", "card_number":"4", "manufacturer":"Panini", "series":"2014 National Notable Nicknames", "year":"2017" }, { "brand":"National Treasures", "card_number":"99", "manufacturer":"Panini", "series":"Collegiate Materials Signatures Silver", "year":"2017" }, { "brand":"National Treasures", "card_number":"199", "manufacturer":"Panini", "series":"Collegiate Materials Signatures Silver", "year":"2017" } ]; let ownedCards = [ { "brand":"National Treasures", "card_number":"43", "manufacturer":"Panini", "series":"Rookie Patch Autographs", "year":"2017" }, { "brand":"National Treasures", "card_number":"4", "manufacturer":"Panini", "series":"2014 National Notable Nicknames", "year":"2017" }, { "brand":"National Treasures", "card_number":"411", "manufacturer":"Panini", "series":"Collegiate Materials", "year":"2017" } ];
let res = relatedCards.filter(x => !ownedCards
.some(y => y.card_number === x.card_number && y.series === x.series));
console.log(res);

为了加快速度,可以使用Set

let relatedCards = [ { "brand":"National Treasures", "card_number":"43", "manufacturer":"Panini", "series":"Rookie Patch Autographs", "year":"2017" }, { "brand":"National Treasures", "card_number":"4", "manufacturer":"Panini", "series":"2014 National Notable Nicknames", "year":"2017" }, { "brand":"National Treasures", "card_number":"99", "manufacturer":"Panini", "series":"Collegiate Materials Signatures Silver", "year":"2017" }, { "brand":"National Treasures", "card_number":"199", "manufacturer":"Panini", "series":"Collegiate Materials Signatures Silver", "year":"2017" } ]; let ownedCards = [ { "brand":"National Treasures", "card_number":"43", "manufacturer":"Panini", "series":"Rookie Patch Autographs", "year":"2017" }, { "brand":"National Treasures", "card_number":"4", "manufacturer":"Panini", "series":"2014 National Notable Nicknames", "year":"2017" }, { "brand":"National Treasures", "card_number":"411", "manufacturer":"Panini", "series":"Collegiate Materials", "year":"2017" } ];
let ownedSet = new Set(ownedCards.map(x => x.card_number + " / " + x.series));
let res = relatedCards.filter(x => !ownedSet.has(x.card_number + " / " + x.series));
console.log(res);