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
相关产品推荐
相关产品推荐

