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

如何合并键相同的两个对象并合并对应数组值?

合并对象时合并对应键的数组值,而非直接覆盖

有两个键名完全相同,但对应数组值不同的对象:

const obj1 = {
  "cars": ["nissan","toyota","hyundai"],
  "color": ["red","black","white"], 
};
const obj2 = {
  "cars": ["gmc","ford","chevrolet"],
  "color": ["orange","blue","grey"], 
};

使用Object.assign(obj1, obj2)或者扩展运算符let merge1 = {...obj1,...obj2}进行合并时,结果是obj2的数组直接覆盖obj1的对应数组:

{
  "cars": ["gmc", "ford", "chevrolet"],
  "color": ["orange", "blue", "grey"] 
}

如果需要将对应键的数组合并,得到如下结果:

{
  "cars": ["nissan","toyota","hyundai","gmc","ford","chevrolet"],
  "color": ["red","black","white","orange","blue","grey"] 
}

可以通过手动遍历键并合并数组的方式实现,以下是两种常用写法:

方法一:遍历键集合合并

const mergedObj = {};
// 收集两个对象的所有键,避免遗漏仅存在于单个对象中的键
const allKeys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]);

for (const key of allKeys) {
  // 合并两个对象的对应数组,若某个对象无该键则用空数组兜底
  mergedObj[key] = [...(obj1[key] || []), ...(obj2[key] || [])];
}

console.log(mergedObj);

方法二:用reduce简化实现

const mergedObj = [...new Set([...Object.keys(obj1), ...Object.keys(obj2)])]
  .reduce((result, key) => {
    result[key] = [...(obj1[key] || []), ...(obj2[key] || [])];
    return result;
  }, {});

console.log(mergedObj);

为什么默认合并方法不行?

Object.assign和对象扩展运算符...的合并逻辑是直接替换相同键的属性值,不管属性值是基本类型还是数组这类引用类型,不会自动处理数组合并,因此需要手动编写数组拼接的逻辑。

内容的提问来源于stack exchange,提问作者Omar E. Manaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:16:28