按Javascipt中的字典列表分组

时间:2019-10-13 18:51:06

标签: javascript

输入=

[{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 个答案:

答案 0 :(得分:0)

这是实现此目的的一种简短方法(根据我之前引用的假设,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,则可以查找该项目原始物料,然后将新数量添加到先前数量。

答案 1 :(得分:0)

我会做这样的事情:

function groupProducts( input ) {
   var productsById = input.reduce( function( current, item ) {
       if( !current[ item.id ] ) {
          current[ item.id ] = [];
       }
       current[ item.id ].push( item );
   }, {} );

   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,例如数量和价格是字符串而不是数字。我假设您知道如何理顺这些内容,以便数据具有适当的数据类型。如果您有相应的字符串,则此方法将无效。