You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比嵌套对象数组并仅返回其中的公共元素

筛选嵌套数组中所有子数组都存在的对象

你当前的代码返回空数组的核心原因是: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:55:23