带有聚合键的Javascript数组reduce
我的目标是从如下数组对象:带有聚合键的Javascript数组reduce,javascript,Javascript,我的目标是从如下数组对象: const data = [ { code: 'prod1', quantity: 13, pricePerItem: 10, totalCost: 130 }, { code: 'prod1', quantity: 7, pricePerItem: 11, totalCost: 77 },
const data = [
{
code: 'prod1',
quantity: 13,
pricePerItem: 10,
totalCost: 130
},
{
code: 'prod1',
quantity: 7,
pricePerItem: 11,
totalCost: 77
},
{
code: 'prod2',
quantity: 10,
pricePerItem: 9,
totalCost: 90
},
{
code: 'prod2',
quantity: 9,
pricePerItem: 10,
totalCost: 90
},
];
以代码作为键构建对象
具有聚合数据的对象,如:
{
prod1:{
quantity: 20,
total: 207
},
prod2:{
quantity: 19,
total:180
}
}
没有对象键是很容易的
data.reduce(
(acc, current) => {
return {
total: acc.total + current.totalCost,
quantity: acc.quantity + current.quantity
};
},
{ total: 0, quantity: 0 }
);
但我被物体钥匙卡住了
您能帮我吗?您可以使用reduce执行以下操作
const res = data.reduce((prev, curr) => {
if(prev.hasOwnProperty(curr.code)) {
prev[curr.code] = {total: prev[curr.code].total + curr.totalCost, quantity: prev[curr.code].quantity + curr.quantity };
return prev;
} else {
prev[curr.code] = {total: curr.totalCost, quantity: curr.quantity };
return prev;
}
}, {});
console.log(res);
您可以使用reduce执行以下操作:
const res = data.reduce((prev, curr) => {
if(prev.hasOwnProperty(curr.code)) {
prev[curr.code] = {total: prev[curr.code].total + curr.totalCost, quantity: prev[curr.code].quantity + curr.quantity };
return prev;
} else {
prev[curr.code] = {total: curr.totalCost, quantity: curr.quantity };
return prev;
}
}, {});
console.log(res);
常数数据=[
{
代码:prod1,
数量:13,
价格:10,
总成本:130
},
{
代码:prod1,
数量:7,
价格:11,
总费用:77
},
{
代码:prod2,,
数量:10,
价格:9,
总成本:90
},
{
代码:prod2,,
数量:9,
价格:10,
总成本:90
}
];
console.log
data.reduceAC,当前=>{
if!acc[当前代码]{
acc[当前代码]={数量:0,总计:0};
}
返回{
…acc,
[当前代码]:{
数量:会计科目【当前编码】。数量+当前数量,
总计:会计科目[当前.代码].总计+当前.总成本
}
};
}, {}
;
常数数据=[
{
代码:prod1,
数量:13,
价格:10,
总成本:130
},
{
代码:prod1,
数量:7,
价格:11,
总费用:77
},
{
代码:prod2,,
数量:10,
价格:9,
总成本:90
},
{
代码:prod2,,
数量:9,
价格:10,
总成本:90
}
];
console.log
data.reduceAC,当前=>{
if!acc[当前代码]{
acc[当前代码]={数量:0,总计:0};
}
返回{
…acc,
[当前代码]:{
数量:会计科目【当前编码】。数量+当前数量,
总计:会计科目[当前.代码].总计+当前.总成本
}
};
}, {}
;
常数数据=[
{
代码:“prod1”,
数量:13,
价格:10,
总成本:130
},
{
代码:“prod1”,
数量:7,
价格:11,
总费用:77
},
{
代码:“prod2”,
数量:10,
价格:9,
总成本:90
},
{
代码:“prod2”,
数量:9,
价格:10,
总成本:90
},
];
var结果=
数据还原
acc,当前=>{
acc[current.code]=acc[current.code]|{数量:0,总计:0};
acc[当前代码]={
总计:科目[当前代码].总计+当前.totalCost,
数量:会计科目【当前编码】。数量+当前数量,
};
返回acc;
},
{}
;
console.logresult
常数数据=[
{
代码:“prod1”,
数量:13,
价格:10,
总成本:130
},
{
代码:“prod1”,
数量:7,
价格:11,
总费用:77
},
{
代码:“prod2”,
数量:10,
价格:9,
总成本:90
},
{
代码:“prod2”,
数量:9,
价格:10,
总成本:90
},
];
var结果=
数据还原
acc,当前=>{
acc[current.code]=acc[current.code]|{数量:0,总计:0};
acc[当前代码]={
总计:科目[当前代码].总计+当前.totalCost,
数量:会计科目【当前编码】。数量+当前数量,
};
返回acc;
},
{}
;
console.logresult
常数数据=[
{
代码:“prod1”,
数量:13,
价格:10,
总成本:130
},
{
代码:“prod1”,
数量:7,
价格:11,
总费用:77
},
{
代码:“prod2”,
数量:10,
价格:9,
总成本:90
},
{
代码:“prod2”,
数量:9,
价格:10,
总成本:90
},
];
让输出=data.reduceac,val=>{
…acc,//展开蓄能器
[val.code]:{
//如果它还不存在,则将其设为0,并添加当前val的属性
数量:acc[val.code]&&acc[val.code]。数量| | 0+val.QUOTE,
totalCost:acc[val.code]&&acc[val.code]。totalCost | | 0+val.totalCost
}
}, {};
//重写console.log以使其看起来像我希望的那样
//这就是美学
console.log=…args=>{
对于args中的let arg{
const pre=document.createElementpre;
pre.innerText=JSON.stringifyarg,null,2;
document.querySelectorbody.appendChildpre;
}
};
// -------------
// -------------
console.logoutput
html,
身体{
背景:白烟;
}
前{
颜色:黑色;
背景:白色;
填充:1rem;
边框:2件纯黑;
边界半径:1em;
}
常数数据=[
{
代码:“prod1”,
数量:13,
价格:10,
总成本:130
},
{
代码:“prod1”,
数量:7,
价格:11,
总费用:77
},
{
代码:“prod2”,
数量:10,
价格:9,
总成本:90
},
{
代码:“prod2”,
数量:9,
价格:10,
总成本:90
},
];
让输出=data.reduceac,val=
> {
…acc,//展开蓄能器
[val.code]:{
//如果它还不存在,则将其设为0,并添加当前val的属性
数量:acc[val.code]&&acc[val.code]。数量| | 0+val.QUOTE,
totalCost:acc[val.code]&&acc[val.code]。totalCost | | 0+val.totalCost
}
}, {};
//重写console.log以使其看起来像我希望的那样
//这就是美学
console.log=…args=>{
对于args中的let arg{
const pre=document.createElementpre;
pre.innerText=JSON.stringifyarg,null,2;
document.querySelectorbody.appendChildpre;
}
};
// -------------
// -------------
console.logoutput
html,
身体{
背景:白烟;
}
前{
颜色:黑色;
背景:白色;
填充:1rem;
边框:2件纯黑;
边界半径:1em;
}