JavaScript数组对象按键去重后对对应value值求和实现方法咨询
按对象key去重后求和的实现方式
你当前的求和逻辑未添加key维度的去重判断,会累计所有15个条目的value,最终得到结果75,和业务预期存在偏差。只需要在求和前完成按key的唯一值筛选,即可得到正确结果。
方案1:单次遍历完成去重+求和(性能优先)
该方案不需要生成额外的中间去重数组,仅遍历一次原数组就能完成全流程计算,适合数据量较大的场景。实现逻辑为遍历过程中用Set存储已经累计过的key,遇到未计数的新key时才累加对应value,已存在的key直接跳过。
const sumOfValue = array.reduce((acc, item) => { // 初始化结构:acc中存储已计数的key集合、累计和 if (!acc.seenKeys) acc.seenKeys = new Set(); if (!acc.sum) acc.sum = 0; if (!acc.seenKeys.has(item.key)) { acc.seenKeys.add(item.key); acc.sum += item.value; } return acc; }, {}).sum;
针对你给出的示例数组,该代码运行后得到的结果为15,和预期一致。
方案2:先去重后求和(逻辑易读)
该方案拆分为两步执行,代码可读性更高,更适合中小型数据量的业务场景:
- 借助Map结构按
key完成去重,自动过滤同key的重复条目 - 对去重后的数组执行value求和
// 第一步:基于key生成Map,同key的条目会自动覆盖,实现去重 const uniqueList = Array.from(new Map(array.map(item => [item.key, item])).values()); // 第二步:对去重后的数组求和 const sumOfValue = uniqueList.reduce((prev, curr) => prev + curr.value, 0);
注意:上述去重逻辑默认同一个key对应的value值是统一的,和你的示例场景匹配;如果业务中存在同一个key对应不同value的情况,需要提前明确规则(保留首次出现/最后一次出现的value),再调整去重的取值逻辑。
内容的提问来源于stack exchange,提问作者vedagna
相关产品推荐
相关产品推荐

