结合逻辑并增加总和

时间:2018-07-10 15:57:28

标签: javascript node.js

此逻辑是将Items ID组合到数组中。如果退出ItemId,则会增加总和。有没有办法使用地图或其他东西来重构它?

function combine2(order) {
    let combine = [];

    message2.Items.forEach((line) => {
        let id = line.ItemId;

        if (combine[id]) {
            combine[id].Sum += line.Sum;
        } else {
            combine[id] = {
                Id: id,
                Sum: line.Sum
            }
        }
    });

    return combine;
}

message2 = {
    Items: [ 
        {ItemId: "222", Sum: 2 },
        {ItemId: "222", Sum: 2 },
        {ItemId: "333", Sum: 3 }
    ]
}

输出

[ <222 empty items>,
    { Id: '222', Sum: 4 },
    <110 empty items>,
    { Id: '333', Sum: 3 } ]

我不明白为什么它在输出中显示<222个空项目>

4 个答案:

答案 0 :(得分:1)

您可以使用Array.reduce()

var message2 = {
    Items: [ 
        {ItemId: "222", Sum: 2 },
        {ItemId: "222", Sum: 2 },
        {ItemId: "333", Sum: 3 }
    ]
}

var res = message2.Items.reduce((acc, obj)=>{
    var existObj = acc.find(item => item.Id === obj.ItemId);
    if(existObj){
      existObj.Sum += obj.Sum;
      return acc;
    }
    acc.push({Id: obj.ItemId, Sum: obj.Sum});
    return acc;
},[]);
console.log(res);

答案 1 :(得分:0)

您应该像let combine = {};中那样,将Combine初始化为json对象,而不是数组。

答案 2 :(得分:0)

获得222个空对象作为数组的原因是因为您拥有else块 } else { combine[id] = { Id: id, Sum: line.Sum } }

此代码的作用是将您的数组称为combine,并向id处的索引中添加内容,因此如果id等于222在第一种情况下,它将在索引222处插入一个类似{ Id: '222', Sum: 4 }的对象,这是数组中的第223个对象。

因此,您将对象作为数组的第223个元素插入,这就是为什么要启动222个空对象的原因

答案 3 :(得分:0)

可以使用Array.reduce()Map()来完成:

var message2 = {
    Items: [ 
        {ItemId: "222", Sum: 2 },
        {ItemId: "222", Sum: 2 },
        {ItemId: "333", Sum: 3 }
    ]
};

var result = message2.Items.reduce((map => (r, a) => {
        map.set(a.ItemId, map.get(a.ItemId) || r[r.push({ ItemId: a.ItemId, Sum: 0 }) - 1]);
        map.get(a.ItemId).Sum += a.Sum;
        return r;
})(new Map), []);
    
 console.log(result);