Javascript 为共享2个不同列的相同值的列添加新的摘要行
我有一个矩阵算法: 输入:Javascript 为共享2个不同列的相同值的列添加新的摘要行,javascript,arrays,matrix,Javascript,Arrays,Matrix,我有一个矩阵算法: 输入: 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'],
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'],
]
简言之:
如果行包含相同的品牌,则相同的品牌和相同的月份在顶部添加一个汇总行,其中包含总销售额,并为每个明细行添加列出的订单
我有一个旧代码:
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 可以使用组合键和析构函数数组
var数组=[[Camry]、[Toyota]、[Jan]、[Nowhere Town]、[Camry]、[Feb]、[Nowhere Town]、[70]、[Camry]、[Toyota]、[Jan]、[Jan]、[Jan]、[Nowhere Town]、[Jan]、[60]、[Prius]、[Prius]、[Toyota]、[Mar]、[Nowhere Town]、[50'],[‘思域’、‘本田’、‘一月’、‘无名镇’、[‘思域’、‘本田’、‘二月’、‘无名镇’、‘10’]、[‘思域’、‘本田’、‘三月’、‘随机镇’、‘10’、[‘思域’、‘本田’、‘无名镇’、‘随机镇’、‘20’],
结果=[].concat(…数组)
.减少((m,[品牌、品牌、月份、城镇、金额])=>{
var key=[品牌、品牌、月份].加入(“|”),
数据=m.get(key)| |[S',品牌,品牌,月份,'0'];
数据推送(['D',data.length,brand,town,amount]);
数据[0][4]=(+数据[0][4]++金额).toString();
返回m.set(键、数据);
},新地图)
.values()
);
console.log(result.map(a=>a.join(“”));
.as console wrapper{max height:100%!important;top:0;}
您可以使用reduce
按品牌、品牌和月份创建对象,然后使用排列语法和object.value
获取数组数组
const-input=[[Camry]、[Toyota]、[Jan]、[Nowhere-Town]、[Camry]、[Feb]、[Nowhere-Town]、[70']、[Camry]、[Toyota]、[Jan]、[Prius]、[Jan]、[60'、[Prius]、[Jan]、[Jan]、[Random-Town]、[60'、[Prius]、[Prius]、[Toyota]、[Mar]、[Nowhere-Town]、[50,[‘思域’、‘本田’、‘一月’、‘无名镇’、[‘思域’、‘本田’、‘二月’、‘无名镇’、‘10’]、[‘思域’、‘本田’、‘三月’、‘随机镇’、[‘思域’、‘本田’、‘三月’、‘随机镇’、]
const obj=input.reduce((r[品牌、品牌、月份、城市、价值])=>{
让key=`${brand}|${make}|${month}`;
如果(!r[key])r[key]=[
['S',品牌,品牌,月份,+价值],
[“D”,1,品牌,城市,价值]
]
否则{
r[键][0][4]+=+值;
设prev=r[key]。切片(-1)[0]
r[key].push([D],prev[1]+1,make,city,value]);
}
返回r;
}, {})
常量结果=[].concat(…Object.values(obj))
console.log(result)
以下中断分两步执行输入。它大量使用es6功能映射和扩展运算符
第一步通过生成一个键值对,然后将每个项添加到由生成的键设置的项数组的映射中,将这些项转换为组
第二步从每个组中获取值以创建一个标头,并将标头作为第一项创建一个新数组。然后将这些组组合成一个数组
const-input=[[Camry]、[Toyota]、[Jan]、[Nowhere-Town]、[Camry]、[Feb]、[Nowhere-Town]、[70']、[Camry]、[Toyota]、[Jan]、[Prius]、[Jan]、[60'、[Prius]、[Jan]、[Jan]、[Random-Town]、[60'、[Prius]、[Prius]、[Toyota]、[Mar]、[Nowhere-Town]、[50,['Civic','Honda','Jan','Nowhere Town','10'],['Civic','Honda','Feb','Nowhere Town','10'],['Civic','Honda','Mard Town','20']]
常量组=新映射();
map(x=>[x.slice(0,3).join('::'),['D',…x.slice(0,4),+x[4]]))
.forEach(([key,val])=>(group.get(key)| | group.set(key,[]).get(key)).push(val));
const result=[].concat(…Array.from(group.values())
.map(x=>[['S',…x[0])。切片(1,4),x.reduce((a,c)=>a+c[5,0)],
…x.map(y=>[…y.slice(0,3),…y.slice(4,6)]);
console.log(result.map(x=>x.toString());
我强烈建议将其更改为对象数组(结构类似于{“Model”:“Camry”,“Make”:“Toyota”,“Month”:“Jan”,“Price?”:3050}
注意,我还将那里的最终值改为一个数字,因为你似乎想对它们进行数学运算。然后你可以使用中概述的技术来完成你要找的事情。@MikeMcCaughan我同意!谢谢你的建议,这个问题的答案会增加每行的总和,但不会增加顶部的行。你知道怎么做吗要做到这一点?还要感谢@Nina Scholz!你又救了我!我可以在LinkedIn或Twitter上与你联系吗?对不起,没有LinkedIn或Twitter。谢谢@Nenad Vracar!我可以在LinkedIn或Twitter上与你联系吗?谢谢@Daniel Gimenez!