Javascript “我该怎么办?”;“总结”;像这样的一组对象?

Javascript “我该怎么办?”;“总结”;像这样的一组对象?,javascript,sum,lodash,Javascript,Sum,Lodash,我有一些数据如下(简化): 我想按product.id对数据进行分组,并将数量和金额相加,并保持相同的类别和子类别(对于所有相同的产品id都是相同的) 因此,基本上我希望我的数据如下所示: filteredSum: [ { 'quantity': 30, 'amount': 110, 'product': { 'category': 'Chemical', 'subcategory': 'He

我有一些数据如下(简化):

我想按
product.id
对数据进行分组,并将
数量
金额
相加,并保持相同的
类别
子类别
(对于所有相同的产品id都是相同的)

因此,基本上我希望我的数据如下所示:

filteredSum: [
    {
        'quantity': 30,
        'amount': 110,
        'product': {
            'category': 'Chemical',
            'subcategory': 'Herbicide'
        }
    },
    {
        'quantity': 30,
        'amount': 60,
        'product': {
            'category': 'Seed',
            'subcategory': 'Corn'
        }
    }
]
我用的是Lodash,这就是我想到的,但有些东西告诉我有一种更简洁的方法可以做到这一点

filteredSum: function () {
    return _(this.sales).groupBy('product.id').map(function (sales) {
        return {
            'quantity': _.sumBy(sales, function(sale) { return Number(sale.quantity); }).toFixed(2),
            'amount': _.sumBy(sales, function(sale) { return Number(sale.amount); }),
            'product': {
                'category': _.head(sales).product.category,
                'subcategory': _.head(sales).product.subcategory
            }
        }
    }).value();
}

当然有更好的方法吗?

最简单的方法是使用
productId
作为主键的对象。然后简单地使用
reduce
在数组上迭代。如果当前产品的
productId
已经存在,只需将其值与前一个值相加,否则将其添加到对象中

const数据=[
{
“数量”:20,
“金额”:40,
“产品”:{
“id”:1,
“类别”:“化学品”,
“子类别”:“除草剂”
}
},
{
“数量”:10,
“金额”:70,
“产品”:{
“id”:1,
“类别”:“化学品”,
“子类别”:“除草剂”
}
},
{
“数量”:30,
“金额”:60,
“产品”:{
“id”:2,
“类别”:“种子”,
“子类别”:“玉米”
}
}
];
常量结果=数据减少((acc,curr)=>{
if(根据[当前产品id]){
acc[当前产品id]。数量+=当前数量;
acc[当前产品id]。金额+=当前金额;
}否则{
acc[当前产品id]=当前;
}
返回acc;
}, {});
const formattedResult=Object.keys(result.map)(条目=>{
返回结果[输入];
});

console.log(formattedResult)最简单的方法是使用
productId
作为主键的对象。然后简单地使用
reduce
在数组上迭代。如果当前产品的
productId
已经存在,只需将其值与前一个值相加,否则将其添加到对象中

const数据=[
{
“数量”:20,
“金额”:40,
“产品”:{
“id”:1,
“类别”:“化学品”,
“子类别”:“除草剂”
}
},
{
“数量”:10,
“金额”:70,
“产品”:{
“id”:1,
“类别”:“化学品”,
“子类别”:“除草剂”
}
},
{
“数量”:30,
“金额”:60,
“产品”:{
“id”:2,
“类别”:“种子”,
“子类别”:“玉米”
}
}
];
常量结果=数据减少((acc,curr)=>{
if(根据[当前产品id]){
acc[当前产品id]。数量+=当前数量;
acc[当前产品id]。金额+=当前金额;
}否则{
acc[当前产品id]=当前;
}
返回acc;
}, {});
const formattedResult=Object.keys(result.map)(条目=>{
返回结果[输入];
});

console.log(formattedResult)
如果可以使用箭头函数,
函数(sale){return Number(sale.quantity);}
变为
sale->Number(sale.quantity)
'更简洁一点。不幸的是,我不能在这个项目中使用ES2015,因为JavaScript没有通过任何构建工具运行。是不是
quantity
amount
有某种关联?如果你可以使用箭头函数,
function(sale){returnnumber(sale.quantity);}
变成
sale->Number(sale.quantity)
'更简洁一点。不幸的是,我不能在这个项目中使用ES2015,因为JavaScript没有通过任何构建工具运行。数量和数量是相关的吗?谢谢,巴德!问:为什么reduce返回的是对象的对象而不是对象的数组?有没有办法让它做后者?谢谢,巴德!问:为什么reduce返回的是对象的对象而不是对象的数组?有没有办法让它做后者?
filteredSum: function () {
    return _(this.sales).groupBy('product.id').map(function (sales) {
        return {
            'quantity': _.sumBy(sales, function(sale) { return Number(sale.quantity); }).toFixed(2),
            'amount': _.sumBy(sales, function(sale) { return Number(sale.amount); }),
            'product': {
                'category': _.head(sales).product.category,
                'subcategory': _.head(sales).product.subcategory
            }
        }
    }).value();
}