javascript - 为 cols 添加新的摘要行共享 2 个不同 cols 的相同值
问题描述
我有一个矩阵算法:
输入:
const input = [
['Camry', 'Toyota', 'Jan', 'Nowhere Town', '50'],
['Camry', 'Toyota', 'Feb', 'Nowhere Town', '70'],
['Camry', 'Toyota', 'Jan', 'Random City', '3000'],
['Prius', 'Toyota', 'Jan', 'Nowhere Town', '60'],
['Prius', 'Toyota', 'Jan', 'Random Town', '60'],
['Prius', 'Toyota', 'Mar', 'Nowhere Town', '50'],
['Civic', 'Honda', 'Jan', 'Nowhere Town', '10'],
['Civic', 'Honda', 'Feb', 'Nowhere Town', '10'],
['Civic', 'Honda', 'Mar', 'Random Town', '10'],
['Civic', 'Honda', 'Mar', 'Random Town', '20'],
]
预期输出:
const output = [
['S', 'Camry', 'Toyota', 'Jan', '3050'],
['D', 1, 'Camry', 'Nowhere Town', '50'],
['D', 2, 'Camry', 'Random City', '3000'],
['S', 'Camry', 'Toyota', 'Feb', '70'],
['D', 1, 'Camry', 'Nowhere Town', '70'],
['S', 'Prius', 'Toyota', 'Jan', '120'],
['D', 1, 'Prius', 'Nowhere Town', '60'],
['D', 2, 'Prius', 'Random Town', '60'],
['S', 'Prius', 'Toyota', 'Mar', '50'],
['D', 1, 'Prius', 'Nowhere Town', '50'],
['S', 'Civic', 'Honda', 'Jan', '10'],
['D', 1, 'Civic', 'Nowhere Town', '10'],
['S', 'Civic', 'Honda', 'Feb', '10'],
['D', 1, 'Civic', 'Nowhere Town', '10'],
['S', 'Civic', 'Honda', 'Mar', '20'],
['D', 1, 'Civic', 'Random Town', '10'],
['D', 2, 'Civic', 'Random Town', '10'],
]
用文字表示:如果行包含相同的Brand、相同的Make和相同的Month ,则在总销售额顶部添加一个 Summary Row,并为每个详细信息行添加列出的订单。
我有一个旧代码:
const groupReport = arr => {
let grouped = [].concat(...arr.reduce((acc, cur) => {
var data = acc.get(cur[1]) || [['P', cur[1], '0']]
data.push(['D', data.length, cur[0], cur[3], cur[4]])
data[0][2] = (+data[0][2] + +cur[4]).toString()
return acc.set(cur[0], data);
}, new Map)
.values()
)
return grouped
}
它不起作用,因为它只比较一个 col(品牌),而不是 Make 和 Month。
解决方案
您可以使用reduce
按品牌、品牌和月份创建对象,然后使用传播语法并Object.values
获取数组数组。
const input = [['Camry', 'Toyota', 'Jan', 'Nowhere Town', '50'],['Camry', 'Toyota', 'Feb', 'Nowhere Town', '70'],['Camry', 'Toyota', 'Jan', 'Random City', '3000'],['Prius', 'Toyota', 'Jan', 'Nowhere Town', '60'],['Prius', 'Toyota', 'Jan', 'Random Town', '60'],['Prius', 'Toyota', 'Mar', 'Nowhere Town', '50'],['Civic', 'Honda', 'Jan', 'Nowhere Town', '10'],['Civic', 'Honda', 'Feb', 'Nowhere Town', '10'],['Civic', 'Honda', 'Mar', 'Random Town', '10'],['Civic', 'Honda', 'Mar', 'Random Town', '20'],]
const obj = input.reduce((r, [brand, make, month, city, value]) => {
let key = `${brand}|${make}|${month}`;
if(!r[key]) r[key] = [
['S', brand, make, month, +value],
["D", 1, make, city, value]
]
else {
r[key][0][4] += +value;
let prev = r[key].slice(-1)[0]
r[key].push(["D", prev[1] + 1, make, city, value]);
}
return r;
}, {})
const result = [].concat(...Object.values(obj))
console.log(result)
推荐阅读
- tsql - Lock\Block 使用 SPID -2 锁定表
- bootstrap-4 - 自动滚动网页
- python - 将 Pandas 时间序列转换为时间增量
- node.js - Swagger-ui 不适用于 restify 但适用于 express
- ios - 没有从 iOS 中的位置管理器获取我的当前地址
- php - 使用 mysqli 类在 PHP 中返回 MySQL 查询
- javascript - Intersection Observer API:观察视口的中心
- unix - Unix 显示学生记录
- python - 如何在 Python 中迭代字符串的长度时迭代字符串
- django-mptt - 使用 TreeManager 时 get_children() 方法出现问题。错误的结果