Angular中如何合并同键JavaScript对象并累加count值?
实现嵌套对象中count值的累加合并
嘿,我懂你的痛点——扩展运算符{...obj1, ...obj2}确实只能做浅合并,遇到嵌套的子对象时,只会用后面对象的子对象直接覆盖前面的,所以没法自动帮你把count值累加起来。要实现你想要的合并逻辑,咱们得写个自定义的合并函数才行。
为什么原方法不行?
你之前的写法里,对于key1、key2这类顶级键,obj2里的整个嵌套对象会直接替换掉obj1中对应的部分,最终count只会保留obj2的数值,完全不会做累加计算。
自定义合并方案
这里给你两种实现思路,都能实现嵌套对象中count的累加:
方法一:for循环遍历实现
function mergeBooks(objA, objB) { // 先复制objA的所有属性作为合并的基础 const merged = {...objA}; // 遍历objB的每个顶级键 for (const key in objB) { if (merged[key]) { // 如果该键在merged中已存在,累加count值,同时保留其他属性 merged[key] = { ...merged[key], count: merged[key].count + objB[key].count }; } else { // 如果该键不存在,直接把objB的对应属性添加进去 merged[key] = {...objB[key]}; } } return merged; } // 测试示例 var obj1 = { key1: { name: 'book1', count: 5 }, key2: { name: 'book2', count: 7 } }; var obj2 = { key1: { name: 'book1', count: 3 }, key2: { name: 'book2', count: 5 } }; var obj3 = mergeBooks(obj1, obj2); console.log(obj3); // 输出结果:{ key1: { name: 'book1', count: 8 }, key2: { name: 'book2', count: 12 } }
方法二:用reduce函数简化写法
如果你更喜欢函数式风格,也可以用reduce来实现:
const mergeBooks = (objA, objB) => { return Object.entries(objB).reduce((acc, [key, value]) => { if (acc[key]) { acc[key] = { ...acc[key], count: acc[key].count + value.count }; } else { acc[key] = {...value}; } return acc; }, {...objA}); };
逻辑说明
这两种方法的核心逻辑一致:
- 先复制第一个对象的所有属性,避免直接修改原对象
- 遍历第二个对象的每个顶级键
- 如果键已存在,则累加两个对象中对应子对象的
count值,同时保留其他属性(比如name) - 如果键不存在,则直接将第二个对象的对应属性添加到结果中
这样不管你后续新增多少书籍键(比如key3),只要嵌套结构保持一致(包含name和count),函数都能自动处理累加逻辑。
内容的提问来源于stack exchange,提问作者user12268835
相关产品推荐
相关产品推荐

