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

JavaScript中如何基于双条件对列分组求和并生成唯一行?

按多字段分组累加二维数组数值的reduce实现

你要实现的逻辑是以前三个字段(ID、商品名、分类)作为唯一分组依据,对第四个数值位做求和合并,完全可以通过reduce()实现,核心是先做分组映射再转结果数组。

实现逻辑

  • 分组判定:取每条记录的前3个字段拼接为唯一分组键,三个字段完全一致的记录判定为同一组
  • 临时存储:reduce初始值传空对象,以分组键为key存储每组的合并后记录
  • 累加逻辑:遍历到新记录时,如果分组已存在就累加数值位,不存在就把当前记录存入分组
  • 结果转换:遍历完成后用Object.values()取出对象里的所有值,就是去重合并后的最终数组

可直接运行的代码

const data = [
  [1, "Item A", "Food", 10],
  [2, "Item B", "Food", 5],
  [3, "Item C", "Food", 30],
  [4, "Item A", "Hygiene", 30],
  [4, "Item A", "Hygiene", 50],
  [6, "Item D", "Food", 7],
  [3, "Item C", "Food", 8],
  [1, "Item A", "Food", 60],
]

const result = Object.values(
  data.reduce((groupAcc, currentRow) => {
    // 用特殊分隔符拼接前三个字段生成分组键,避免字段内容冲突导致分组错误
    const uniqueKey = `${currentRow[0]}||${currentRow[1]}||${currentRow[2]}`
    if (groupAcc[uniqueKey]) {
      // 同组数据累加第四位数值
      groupAcc[uniqueKey][3] += currentRow[3]
    } else {
      // 新分组拷贝当前行存入,避免修改原始数据
      groupAcc[uniqueKey] = [...currentRow]
    }
    return groupAcc
  }, {})
)

console.log(result)

运行后输出的结果和你给出的预期完全一致:

[
  [1, "Item A", "Food", 70],
  [2, "Item B", "Food", 5],
  [3, "Item C", "Food", 38],
  [4, "Item A", "Hygiene", 80],
  [6, "Item D", "Food", 7]
]

注意点

  • 不要直接用数组作为对象的键:JS里对象键会自动转字符串,如果字段本身包含逗号,直接用数组转字符串生成的键可能出现冲突,用自定义的不常见分隔符(比如上面的||)拼接更稳妥
  • 拷贝当前行的操作是可选的:如果你不需要保留原始data数组的内容,可以直接赋值groupAcc[uniqueKey] = currentRow,省去拷贝开销
  • 如果后续分组字段有增减,只需要修改uniqueKey的拼接逻辑即可,不用改动核心累加代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:06:26