如何过滤对象数组,保留匹配另一数组中对象全部键值对的元素?
问题解决:按多键值对过滤数组
给定两个对象数组:
let array1 = [ {id: 1, name: "Test Item 1", price: 100, type: 'item'}, {id: 1, name: "Test Fee 1", price: 200, type: 'fee'}, {id: 3, name: "Test 3", price: 300, type: 'item'}, ]
let array2 = [ {id: 1, type: "item"}, {id: 3, type: "item"}, ]
需要过滤array1,仅保留能匹配array2中任意对象全部键值对的元素,预期返回array1[0]和array1[2]。
原代码问题分析
你当前的解决方案用了some方法,它只要匹配到任意一个键值对就返回true,这会导致不符合"全部匹配"要求的元素被错误保留。比如array1[1]的id是1,会匹配array2第一个对象的id,但它的type是fee,并不符合,却会被误判为符合条件。
修正后的代码
array1.filter(row => { return array2.some(r => { // 检查r中的所有键值对是否都能在row中找到完全匹配 return Object.entries(r).every(([key, value]) => row[key] === value); }); });
代码逻辑说明
- 外层
filter:遍历array1的每个元素,判断是否符合筛选条件。 - 内层
some:检查当前元素是否能匹配array2中的任意一个规则对象。 every方法:对array2中的单个规则对象,确保它的所有键值对都能和当前元素对应键的值完全匹配。只有当所有键值对都匹配时,该元素才符合这个规则。
这样就能精准筛选出满足array2中任意规则全部键值对的元素,得到预期结果。
内容的提问来源于stack exchange,提问作者xTheWolf
相关产品推荐
相关产品推荐

