如何在JS中按键匹配多个对象并合并其数组值
多对象数组中提取共有键并合并对应数组
问题场景
我有一个对象数组:
var arr = [ {a: ["ram", "shyam", "kunal"], b: ["abc", "xyz", "wxd"], c: ["nyx", "lux", "poc"]}, {d: ["ry", "cd", "er"], e: ["ew", "op", "re", "er"], c:["er", "sd", "we"]}, {a: ["we", "as"], e: ["we", "lk", "pm"], c:["cv", "as", "xc"]} ]
需要找出所有对象共有的键(比如示例中的c),并将该键对应的所有数组合并为一个数组。数组中的对象数量可能超过3个(比如4或5个),期望输出:key c :["nyx", "lux", "poc", "er", "sd", "we", "cv", "as", "xc"]
当前代码的局限性
我目前的代码仅支持两个对象的匹配,无法处理多对象场景:
for (var i = 0; i < ar.length; i++) { for (var key in arr[0]) { if (i > 0) { if (arr[i].hasOwnProperty(key)) { arr[0][key].push(...arr[i][key]); } } } }
解决方案
实现思路
- 先拿第一个对象的所有键当候选,再逐个和后面的对象比对,只保留所有对象都有的键
- 对每个筛选出来的共有键,把所有对象里该键对应的数组挨个合并起来
完整代码
const arr = [ {a: ["ram", "shyam", "kunal"], b: ["abc", "xyz", "wxd"], c: ["nyx", "lux", "poc"]}, {d: ["ry", "cd", "er"], e: ["ew", "op", "re", "er"], c:["er", "sd", "we"]}, {a: ["we", "as"], e: ["we", "lk", "pm"], c:["cv", "as", "xc"]} ]; // 1. 初始化共有键候选列表(第一个对象的所有键) let commonKeys = Object.keys(arr[0]); // 2. 遍历后续对象,筛选出真正的共有键 for (const obj of arr.slice(1)) { const currentKeys = Object.keys(obj); // 只保留在当前对象中存在的键 commonKeys = commonKeys.filter(key => currentKeys.includes(key)); // 提前终止:如果已经没有共有键了,不用继续遍历 if (commonKeys.length === 0) break; } // 3. 合并共有键对应的所有数组 const mergedResult = {}; for (const key of commonKeys) { // flatMap自动把每个对象的数组提取并合并成一个数组 mergedResult[key] = arr.flatMap(item => item[key]); } console.log(mergedResult); // 输出:{ c: ["nyx", "lux", "poc", "er", "sd", "we", "cv", "as", "xc"] }
代码细节说明
Object.keys(obj):快速获取对象的所有键名filter()+includes():逐步缩小候选键范围,确保最终的键在所有对象中都存在flatMap():替代map加flat的写法,一步完成数组提取和合并,简洁高效- 加入了提前终止逻辑,当没有共有键时直接跳出循环,优化性能
内容的提问来源于stack exchange,提问作者Akanksha Mohanty
相关产品推荐
相关产品推荐

