Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为共享2个不同列的相同值的列添加新的摘要行_Javascript_Arrays_Matrix - Fatal编程技术网

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!