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

如何求解键名动态未知的两个JavaScript对象数组的交集

动态键名对象数组交集实现方案

核心判定规则

交集判定以hierarchy1的对象结构为基准:只要hierarchy1中某对象的全部自有键值对,都能在hierarchy2的任意对象中找到完全相等的对应键值对,无论hierarchy2的对象是否存在额外键,都判定为命中交集,最终返回的交集元素结构和hierarchy1元素完全一致。

实现思路

  • 遍历hierarchy1的每一个元素,作为待匹配项
  • 动态提取当前待匹配项的所有自有键,不需要提前预知键名
  • 检查hierarchy2中是否存在至少一个对象,满足待匹配项所有键的对应值完全相等
  • 收集所有命中匹配的待匹配项,即为最终交集结果

代码实现

原生JS版本(适配基本类型属性值)

// 测试数据
const hierarchy1 = [
  { level1: 'Shoes' }
]
const hierarchy2 = [
  { level1: 'Shoes', level2: 'Sneakers' }
]

function getIntersection(baseArr, compareArr) {
  return baseArr.filter(baseItem => {
    const matchKeys = Object.keys(baseItem)
    return compareArr.some(compareItem => {
      return matchKeys.every(key => compareItem[key] === baseItem[key])
    })
  })
}

// 执行调用
const res = getIntersection(hierarchy1, hierarchy2)
console.log(res) // 输出 [{ level1: 'Shoes' }],符合预期

兼容引用类型值版本(依赖lodash深比较)

如果对象属性值存在嵌套对象、数组等引用类型,把全等判断替换为lodash的深比较方法即可,不需要改动其他逻辑:

// 引入lodash后替换判断逻辑即可
return matchKeys.every(key => _.isEqual(compareItem[key], baseItem[key]))

方案说明

_.intersectionBy无法使用的核心原因是该方法要求提前传入固定的比对属性名,本方案在运行时动态提取基准对象的键生成匹配规则,完全适配键名动态生成的场景,没有硬编码的键名依赖。

内容的提问来源于stack exchange,提问作者Mary Oleksiuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:06:20