如何求解键名动态未知的两个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
相关产品推荐
相关产品推荐

