如何优雅合并存在重复键的两个Javascript对象且不覆盖原有属性
JavaScript重复键类数组对象合并方案
你要实现的是两个键为自增数字的类数组对象的顺序拼接,而非同键属性合并,以下是更简洁的实现方案:
方案1 兼容性写法
兼容ES2017及以上所有运行环境,一行代码实现:
const obj3 = Object.assign({}, Object.values(obj1).concat(Object.values(obj2)));
实现逻辑:
- 用
Object.values()分别取出两个对象按数字键升序排列的所有值,得到两个数组 - 通过数组
concat()方法拼接两个值数组 Object.assign()会自动将数组的索引作为新对象的键,最终输出完全符合你预期的结果。
方案2 ES6+简洁写法
如果你的运行环境支持ES6展开语法,可以写得更短:
const obj3 = {...[...Object.values(obj1), ...Object.values(obj2)]};
注意点
你现有实现存在隐患:普通对象没有内置length属性,只有真实数组、或手动添加了length属性的特殊类数组对象才能读取到length值,普通场景下obj2.length会返回undefined导致循环不生效,上述两种方案不存在这个问题,适配所有键为自增数字的对象场景。
目前ECMAScript没有专门针对这类场景的独立内置方法,但是用现有内置API组合的写法已经足够简洁,可维护性也比手动循环更高。
内容的提问来源于stack exchange,提问作者Coding12345
相关产品推荐
相关产品推荐

