带有聚合键的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; }