Javascript 在数组中合并常用对象并添加频率

Javascript 在数组中合并常用对象并添加频率,javascript,arrays,Javascript,Arrays,我有一个数组: [ { "id": "#1", "quantity": 2 }, { "id": "#2", "quantity": 1 }, { "id": "#3", "quantity": 1 }, { "id": "#1", "quantity": 2 }, { "id":

我有一个数组:

[
    {
        "id": "#1",
        "quantity": 2
    },
    {
        "id": "#2",
        "quantity": 1
    },
    {
        "id": "#3",
        "quantity": 1
    },
    {
        "id": "#1",
        "quantity": 2
    },
    {
        "id": "#2",
        "quantity": 1
    },
    {
        "id": "#3",
        "quantity": 1
    }
]
我希望结果是这样的

[
    {
        "id": "#1",
        "quantity": 4
    },
    {
        "id": "#2",
        "quantity": 2
    },
    {
        "id": "#3",
        "quantity": 2
    }
]
基本上是将相同ID的对象组合起来,并将数量相加。
我可以使用2个for循环来实现这一点。但是在Javascript中有没有更优化的方法来解决这个问题?

一个选项是首先将数组缩减为一个对象,如果键相同,则添加数量,然后获取对象的值:

var-arr=[
{
“id”:“1”,
“数量”:2
},
{
“id”:“2”,
“数量”:1
},
{
“id”:“3”,
“数量”:1
},
{
“id”:“1”,
“数量”:2
},
{
“id”:“2”,
“数量”:1
},
{
“id”:“3”,
“数量”:1
}
]
console.log(
对象值(arr.reduce((obj,rec)=>{
if(对象[rec.id]==未定义){
obj[rec.id]=rec;
}否则{
对象[rec.id]。数量+=rec.quantity;
}
返回obj;
}, {}))

)
一个选项是首先将数组缩小为一个对象,如果键相同,则添加数量,然后获取对象的值:

var-arr=[
{
“id”:“1”,
“数量”:2
},
{
“id”:“2”,
“数量”:1
},
{
“id”:“3”,
“数量”:1
},
{
“id”:“1”,
“数量”:2
},
{
“id”:“2”,
“数量”:1
},
{
“id”:“3”,
“数量”:1
}
]
console.log(
对象值(arr.reduce((obj,rec)=>{
if(对象[rec.id]==未定义){
obj[rec.id]=rec;
}否则{
对象[rec.id]。数量+=rec.quantity;
}
返回obj;
}, {}))

)
类似的东西可以完成这项工作:

function transform(a) {
    const seen = {};
    const ret = [];
    a.forEach(o => {
        const id = o.id;
        seen[id] = (seen[id] || 0) + o.quantity;
    });

    for (let key in seen) {
        ret.push({
            id: key,
            quantity: seen[key]
        });
    }
    return ret;
}
console.log(transform([{
    "id": "#1",
    "quantity": 2
}, {
    "id": "#2",
    "quantity": 1
}, {
    "id": "#3",
    "quantity": 1
}, {
    "id": "#1",
    "quantity": 2
}, {
    "id": "#2",
    "quantity": 1
}, {
    "id": "#3",
    "quantity": 1
}]));

像这样的东西可以完成任务:

function transform(a) {
    const seen = {};
    const ret = [];
    a.forEach(o => {
        const id = o.id;
        seen[id] = (seen[id] || 0) + o.quantity;
    });

    for (let key in seen) {
        ret.push({
            id: key,
            quantity: seen[key]
        });
    }
    return ret;
}
console.log(transform([{
    "id": "#1",
    "quantity": 2
}, {
    "id": "#2",
    "quantity": 1
}, {
    "id": "#3",
    "quantity": 1
}, {
    "id": "#1",
    "quantity": 2
}, {
    "id": "#2",
    "quantity": 1
}, {
    "id": "#3",
    "quantity": 1
}]));

如果选择具有唯一关键点的对象,则会更容易->如果选择具有唯一关键点的对象,则会更容易->