2 回答
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 我注意到在您的输入示例中,数量和价格等内容是字符串而不是数字。我将假设您知道如何理顺这些事情,以便数据具有正确的数据类型。如果您有这些字符串,这将不起作用。
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项目,则查找该原始项目,并将新数量添加到之前的数量上。
添加回答
举报