如何在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值分组,而非对象引用的重复。
解决方案思路解析
- 对象缓存分组:用临时对象
cache把key作为键,对应的合并后对象作为值,这样能快速判断当前key是否已经处理过,时间效率更高。 - 遍历处理条目:遍历原数组时,若
key已存在则合并numbers数组,不存在则初始化对应条目。 - 转换为目标数组:最后用
Object.values(cache)把缓存对象的所有值提取出来,转换成你需要的数组格式。
这种方法的时间复杂度是O(n)(n为原数组长度),比嵌套循环的O(n²)效率高很多,适合处理大数据量的场景。
内容的提问来源于stack exchange,提问作者Alan Nama Yosuf
相关产品推荐
相关产品推荐

