按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 的预定义函数来简短回答它。


慕运维8079593
浏览 137回答 2
2回答

ABOUTYOU

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

墨色风雨

这是执行此操作的一种简短方法(基于我之前引用的假设,这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: []}).arrayreduce如果您不熟悉它,这将使用数组函数。这可以在没有 的情况下完成Map,但这比搜索整个结果数组以查找id已经看到的值更有效。此代码背后的想法是,您保留您看到的第一个项目,该项目具有id您以前从未见过的项目,如果您以前看过一个id项目,则查找该原始项目,并将新数量添加到之前的数量上。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript