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

如何在JavaScript中合并JSON数组里相同key对应的数组值?

合并相同key的对象numbers数组解决方案

你的需求是把数组中拥有相同key的对象的numbers数组合并,这里给你一个高效且清晰的实现方式:

const data = [ 
  {"key":11,"numbers":[555,556,557]}, 
  {"key":22,"numbers":[444,772,995,667]}, 
  {"key":11,"numbers":[223,447]}, 
  {"key":45,"numbers":[999,558,367]} 
];

function mergeByKey(data) {
  // 用一个对象来缓存每个key对应的条目
  const cache = {};
  
  data.forEach(item => {
    if (cache[item.key]) {
      // 如果key已存在,合并numbers数组
      cache[item.key].numbers = cache[item.key].numbers.concat(item.numbers);
    } else {
      // 如果key不存在,把当前对象存入缓存(浅拷贝避免修改原数组对象)
      cache[item.key] = {...item};
    }
  });
  
  // 把缓存对象的值转换成数组返回
  return Object.values(cache);
}

console.log(mergeByKey(data));

运行这段代码后,就能得到你期望的结果:

[
  {"key":11,"numbers":[555,556,557,223,447]},
  {"key":22,"numbers":[444,772,995,667]},
  {"key":45,"numbers":[999,558,367]}
]

你的代码存在的问题

我们来拆解下你当前代码里的几个关键问题:

  • indexOf无法匹配相同key的不同对象:indexOf用的是严格相等(===)比较,而数组里的每个对象都是独立的引用,所以data.indexOf(element, index + 1)永远找不到和element匹配的对象,根本不会进入处理逻辑。
  • concat参数错误:data.indexOf返回的是数字类型的索引,而concat需要接收数组或元素,这会导致拼接逻辑完全错误。
  • 思路方向偏差:你试图寻找重复的对象引用,但我们实际需要的是按key值分组,而非对象引用的重复。

解决方案思路解析

  1. 对象缓存分组:用临时对象cache把key作为键,对应的合并后对象作为值,这样能快速判断当前key是否已经处理过,时间效率更高。
  2. 遍历处理条目:遍历原数组时,若key已存在则合并numbers数组,不存在则初始化对应条目。
  3. 转换为目标数组:最后用Object.values(cache)把缓存对象的所有值提取出来,转换成你需要的数组格式。

这种方法的时间复杂度是O(n)(n为原数组长度),比嵌套循环的O(n²)效率高很多,适合处理大数据量的场景。

内容的提问来源于stack exchange,提问作者Alan Nama Yosuf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:10