You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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});
};

逻辑说明

这两种方法的核心逻辑一致:

  1. 先复制第一个对象的所有属性,避免直接修改原对象
  2. 遍历第二个对象的每个顶级键
  3. 如果键已存在,则累加两个对象中对应子对象的count值,同时保留其他属性(比如name)
  4. 如果键不存在,则直接将第二个对象的对应属性添加到结果中

这样不管你后续新增多少书籍键(比如key3),只要嵌套结构保持一致(包含name和count),函数都能自动处理累加逻辑。

内容的提问来源于stack exchange,提问作者user12268835

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:32:31