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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:08:25