如何对比嵌套对象数组并仅返回其中的公共元素
筛选嵌套数组中所有子数组都存在的对象
你当前的代码返回空数组的核心原因是:indexOf和includes判断对象是否匹配时,是基于对象的引用地址,而非对象的内容。你的嵌套数组里,即使内容完全相同的对象,也是独立创建的不同引用,所以无法被匹配到。
要解决这个问题,需要基于对象的实际内容(比如name和email字段)来判断两个对象是否相等,而非依赖引用。以下是两种可行的实现方式:
方法1:修改filter+every逻辑
const arrays = [ [ { name: 'name1', email: 'email1' }, { name: 'name2', email: 'email2' } ], [ { name: 'name1', email: 'email1' } ], [ { name: 'name1', email: 'email1' }, { name: 'name2', email: 'email2' } ] ]; const filteredArray = arrays.shift().filter(targetObj => { // 检查所有剩余子数组中是否都包含和targetObj内容匹配的对象 return arrays.every(subArray => { return subArray.some(item => item.name === targetObj.name && item.email === targetObj.email); }); }); console.log('filteredArray => ', filteredArray);
方法2:修改reduce逻辑
const arrays = [ [ { name: 'name1', email: 'email1' }, { name: 'name2', email: 'email2' } ], [ { name: 'name1', email: 'email1' } ], [ { name: 'name1', email: 'email1' }, { name: 'name2', email: 'email2' } ] ]; const filteredArray = arrays.reduce((prevResult, currSubArray) => { return prevResult.filter(item => { return currSubArray.some(currItem => currItem.name === item.name && currItem.email === item.email); }); }); console.log('filteredArray => ', filteredArray);
通用优化:封装对象比较函数
如果你的对象包含更多字段,可以封装一个通用的浅比较函数,避免重复写判断逻辑:
function isObjectEqual(objA, objB) { const keysA = Object.keys(objA); const keysB = Object.keys(objB); // 键的数量不同直接返回不相等 if (keysA.length !== keysB.length) return false; // 遍历所有键,检查对应值是否相等 return keysA.every(key => objA[key] === objB[key]); } // 使用这个函数替换之前的字段判断 const filteredArray = arrays.shift().filter(targetObj => { return arrays.every(subArray => { return subArray.some(item => isObjectEqual(item, targetObj)); }); });
内容的提问来源于stack exchange,提问作者sgt_pepper85
相关产品推荐
相关产品推荐

