为了账号安全,请及时绑定邮箱和手机立即绑定

按javascript中的字典列表分组

按javascript中的字典列表分组

慕运维8079593 2021-11-18 20:57:01
输入 =[{id: 13, display_name: "Customizable Desk (Aluminium, Black)", quantity: 4, unit_price: "800.40", discount: 0, price: "3201.60"},{id: 40, display_name: "Magnetic Board", quantity: 2, unit_price: "1.98", discount: 0, price: "3.96"},{id: 40, display_name: "Magnetic Board", quantity: 1, unit_price: "1.98", discount: 0, price: "1.98"},{id: 40, display_name: "Magnetic Board", quantity: 1, unit_price: "1.98", discount: 0, price: "1.98"}]输出 =[{id: 13, display_name: "Customizable Desk (Aluminium, Black)", quantity: 4, unit_price: "800.40", discount: 0, price: "3201.60"},{id: 40, display_name: "Magnetic Board", quantity: 4, unit_price: "1.98", discount: 0, price: "7.92"}]我能够得到一个答案,但我的过程非常漫长,我需要使用一些 javascript 的预定义函数来简短回答它。
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我会做这样的事情:


function groupProducts( input ) {

   var productsById = input.reduce( function( current, item ) {

       if( !current[ item.id ] ) {

          current[ item.id ] = [];

       }

       current[ item.id ].push( item );

       return current;

   }, {} );


   return Object.keys( productsById ).map( function( id ) {

       productsById[ id ].reduce( function( current, item ) {

           if( current ) {

              // this could be extracted as a closure passed in to coalesce items together.  Your rules for how that happens go here.

              current.quantity += item.quantity;

              current.price += item.price;

              return current;

           } else {

              return Object.assign( {}, item );  // shallow copy beware

           }

       }, null );

   } );

}

PS 我注意到在您的输入示例中,数量和价格等内容是字符串而不是数字。我将假设您知道如何理顺这些事情,以便数据具有正确的数据类型。如果您有这些字符串,这将不起作用。


查看完整回答
反对 回复 2021-11-18
?
墨色风雨

TA贡献1853条经验 获得超6个赞

这是执行此操作的一种简短方法(基于我之前引用的假设,这quantity是每个具有相同id值的项目唯一可以变化的):


inputArray.reduce((result, item) => {

  if (result.map.has(item.id)) {

    result.map.get(item.id).quantity += item.quantity;

  } else {

   result.array.push(item);

   result.map.set(item.id, item);

  }

  return result;

}, {map: new Map(), array: []}).array

reduce如果您不熟悉它,这将使用数组函数。这可以在没有 的情况下完成Map,但这比搜索整个结果数组以查找id已经看到的值更有效。


此代码背后的想法是,您保留您看到的第一个项目,该项目具有id您以前从未见过的项目,如果您以前看过一个id项目,则查找该原始项目,并将新数量添加到之前的数量上。


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信