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

基于唯一键的属性值求和:寻求更优JavaScript实现方案

更优解决方案:按唯一属性统计指定属性求和

嘿,你的需求我完全get到了——要对对象数组里的quantity求和,但每个field值只统计一次(比如"aaa"出现多次只算第一个的数量),最终结果要得到16。你的现有思路是对的,但确实可以简化,而且效率更高!

先明确场景示例

假设你的group结构是这样的(按field分组后的对象):

const group = {
  "aaa": [{ field: "aaa", quantity: 8 }, { field: "aaa", quantity: 5 }],
  "bbb": [{ field: "bbb", quantity: 8 }]
};

按照需求,我们只需要取每个分组里第一个对象的quantity相加(8+8=16)。

方案1:利用分组对象的key唯一性(最简洁)

因为group的每个key就是唯一的field值,所以完全不需要额外去重!直接遍历分组数组,取每个分组第一个元素的quantity累加即可:

const totalQuantity = Object.values(group).reduce(
  (accum, items) => accum + items[0].quantity,
  0
);

这一行就搞定了!相比你的代码,省去了创建uniqueArray和多余的find判断,效率更高,代码也更简洁。

方案2:如果是未分组的原始数组

如果你的数据源是未分组的原始对象数组(比如直接从接口拿到的),可以用Set来跟踪已经处理过的field,一次遍历完成求和:

const originalArray = [
  { field: "aaa", quantity: 8 },
  { field: "aaa", quantity: 5 },
  { field: "bbb", quantity: 8 }
];

const seenFields = new Set();
const totalQuantity = originalArray.reduce((sum, item) => {
  if (!seenFields.has(item.field)) {
    seenFields.add(item.field);
    return sum + item.quantity;
  }
  return sum;
}, 0);

这里Set的查找是O(1)时间复杂度,比用数组find的O(n)高效得多,数据量大的时候优势明显。

为什么你的代码可以简化?

你原来的代码里,uniqueArray.find(k => k.field === key)其实是多余的——因为group的每个key都是唯一的field值,所以每个group[key]对应的都是同一个field的分组,不存在重复添加的情况,直接取第一个元素累加就好啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:30:21