输入=
[{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函数来为其提供一个简短的答案。
答案 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,例如数量和价格是字符串而不是数字。我假设您知道如何理顺这些内容,以便数据具有适当的数据类型。如果您有相应的字符串,则此方法将无效。