如何按指定属性从对象数组中筛选完全匹配的相似项?
解决筛选与目标对象所有指定属性匹配的相似对象问题
你的代码逻辑存在核心问题:遍历每个筛选属性时,只要对象匹配当前单个属性就加入结果数组,这导致只要对象满足任意一个指定属性就会被保留,而非所有指定属性都匹配。比如id=6的对象仅class属性和目标一致,却被错误加入结果。
修正后的实现代码
const data = [ { id: 1, name: 'ali', class: 12, thisSec: true }, { id: 2, name: 'vicks', class: 11, thisSec: false }, { id: 3, name: 'ali', class: 12, thisSec: true }, { id: 4, name: 'vicks', class: 11, thisSec: false }, { id: 5, name: 'nick', class: 10, thisSec: true }, { id: 6, name: 'lick', class: 12, thisSec: false }, ] const checkFilter = (id, searchCritera) => { if (id && searchCritera.length) { const selectedItem = data.find(item => item.id === id); if (!selectedItem) return; // 处理目标对象不存在的边界情况 // 筛选逻辑:排除自身 + 所有指定属性值完全匹配 const dataneeded = data.filter(dataItem => { if (dataItem.id === selectedItem.id) return false; return searchCritera.every(prop => dataItem[prop] === selectedItem[prop]); }); console.log('dataneeded ', dataneeded); } } checkFilter(1, ['name', 'class'])
关键逻辑说明
- 找到目标对象:通过
find方法定位指定id的目标对象 - 批量筛选:使用
filter遍历数组,批量过滤符合条件的对象 - 全属性校验:用
every方法确保所有指定属性的值都与目标对象一致,避免部分匹配的对象混入 - 排除自身:提前过滤掉目标对象本身,避免结果包含自身
调用checkFilter(1, ['name', 'class'])后,只会返回id=3的对象,符合所有指定属性匹配的要求。
内容的提问来源于stack exchange,提问作者Ali Mir
相关产品推荐
相关产品推荐

