如何将两个JavaScript对象合并为键值为数组的对象?
合并对象重复键为数组的实现方案
嘿,这个问题很实用!先直接给你明确结论:单纯靠扩展运算符(spread operator)没办法直接实现这种把重复键的值合并成数组的需求——因为扩展运算符处理对象重复键时,后面对象的键值会直接覆盖前面的,没法自动把多个值打包成数组。
最简单的实现方式
如果只是针对这一个特定的重复键,最直接的写法就是手动把两个值放到数组里:
const obj1 = { "1,1": "hello" }; const obj2 = { "1,1": "hi" }; const obj3 = { "1,1": [obj1["1,1"], obj2["1,1"]] };
通用的合并函数(支持多键/多对象)
如果需要处理更复杂的场景(比如多个重复键、多个对象),可以写一个通用的合并函数,遍历所有对象的键值对,自动把重复键的值合并成数组:
function mergeObjectsWithArrayValues(...objects) { const merged = {}; objects.forEach(obj => { Object.entries(obj).forEach(([key, value]) => { if (merged[key]) { // 若键已存在,判断当前值是否为数组,再添加新值 merged[key] = Array.isArray(merged[key]) ? [...merged[key], value] : [merged[key], value]; } else { merged[key] = value; } }); }); return merged; } // 使用示例 const obj1 = { "1,1": "hello", "2,2": "foo" }; const obj2 = { "1,1": "hi", "2,2": "bar" }; const obj3 = mergeObjectsWithArrayValues(obj1, obj2); // 输出:{ "1,1": ["hello", "hi"], "2,2": ["foo", "bar"] }
为什么扩展运算符不行?
试一下用扩展运算符合并的话:
const obj3 = {...obj1, ...obj2}; // 结果是 { "1,1": "hi" }
这里obj2的"1,1"值直接覆盖了obj1的,完全达不到合并成数组的效果,所以扩展运算符只能处理无重复键的对象合并,没法满足你的需求。
内容的提问来源于stack exchange,提问作者guitard00d123
相关产品推荐
相关产品推荐

