将具有公共 ID 的对象数组分组并使用 javascript 连接它们的其他属性

问题描述 投票:0回答:1

我正在尝试实现一个相当复杂的迭代,但到目前为止使用reduce 还没有成功。这是一个小例子

输入如下

let input = {
    "data": [
        {
            "state": "CA",
            "city": [ "Mountain View"],
            "metadata": { "id": 15 },
        },
        {
            "state": "TX",
            "city": [ "Austin" ],
            "metadata": { "id": 15 },
        },
        {
            "state": "AZ",
            "city": [ "Flagstaff" ],
            "metadata": { "id": 10 },
        },
    ],
}

正如您可以清楚地看到的,

id
在 2 个对象中重复了两次。我想当 id 相同时将这两个对象连接成一个。因此,如果有 3 个具有相同 id 的对象,我想将 3 个对象连接为一个。除此之外,我还想在 id 匹配时连接
state
city
属性。

所以我的最终输出应该是这样的

let result = {
    "data": [
        {
            "state": ["CA", "TX"],
            "city": ["Mountain View", "Austin"],
            "metadata": { "id": 15 },
        },
        {
            "state": "AZ",
            "city": [ "Flagstaff" ],
            "metadata": { "id": 10 },
        },
    ],
}

有人可以让我知道如何精确实现这一目标吗?这是我尝试使用reduce的方法,但我无法得到预期的最终结果。

let result = Object.values(input?.data?.reduce((acc, {state, city, metadata}) => {
    if (!acc[metadata?.id]) {
        acc[metadata?.id] = { id };
    }
    acc[metadata?.id].state = acc[metadata?.id].state.concat(state);
    acc[metadata?.id].city = acc[metadata?.id].city.concat(city);
    return acc;
}, {}));
javascript arrays loops object iteration
1个回答
0
投票

enter image description here

这是解决方案

© www.soinside.com 2019 - 2024. All rights reserved.