如何优雅合并存在重叠键的多个JavaScript对象?
问题
现有多个包含重叠键的对象,每个键代表一年中的某一周,对应的值是存储整数测试结果的对象,示例如下:
const ab_tests = { week1: { a: 4, b: 6 }, week2: { a: 0, b: 9 } }; const cd_tests = { week2: { c: 2, d: 5 }, week3: { c: 6, d: 7 } }; const xy_tests = { week1: { x: 1, y: 1 }, week4: { x: 100, y: 123 } };
需要将它们优雅地合并为一个单一对象,包含所有周作为键,对应值为合并后的对象,最终结果如下:
const merged_tests = { week1: { a: 4, b: 6, x: 1, y: 1 }, week2: { a: 0, b: 9, c: 2, d: 5 }, week3: { c: 6, d: 7 }, week4: { x: 100, y: 123 }, };
解决方案
方法一:原生JS结合reduce与展开语法
把所有待合并对象放进数组,通过reduce遍历累积结果,对每个周的对象用展开语法合并属性,逻辑清晰且无依赖:
const testObjects = [ab_tests, cd_tests, xy_tests]; const merged_tests = testObjects.reduce((acc, curr) => { for (const week in curr) { acc[week] = { ...(acc[week] || {}), ...curr[week] }; } return acc; }, {});
方法二:原生JS结合reduce与Object.assign
和上一种思路一致,用Object.assign替代展开语法完成属性合并:
const testObjects = [ab_tests, cd_tests, xy_tests]; const merged_tests = testObjects.reduce((acc, curr) => { for (const week in curr) { acc[week] = Object.assign({}, acc[week] || {}, curr[week]); } return acc; }, {});
方法三:Lodash的merge函数(项目已引入Lodash时使用)
如果项目依赖Lodash,一行代码即可完成递归合并,简洁高效:
const merged_tests = _.merge({}, ab_tests, cd_tests, xy_tests);
内容的提问来源于stack exchange,提问作者benito_h
相关产品推荐
相关产品推荐

