将具有相似属性的对象数组分组并通过连接值获得结果

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

我有这个对象数组,如下

let data = [
    { "id": "12", "values": [ "_status.com", "_verify.com" ] },
    { "id": "12", "values": [ "_result.com"] },
    { "id": "15", "values": [ "_integrate.com"] }
]

如果您注意到,对象数组有 2 个具有相同 id

12
的对象,并且
values
中组合在一起有 3 个变量。同样,id
15
只有一个值变量。

我如何将它们组合在一起并将 value 属性累积在一个数组中。我想达到以下结果。

let result = [
    { "id": "12", "values": [ "_status.com", "_verify.com", "_result.com" ] },
    { "id": "15", "values": [ "_integrate.com"] }
]

有人可以让我知道如何实现这一目标吗?我确实在网上搜索了有关对象数组迭代的信息,但这是一个非常独特且不同的示例,我找不到任何接近解决它的东西。

javascript reactjs arrays loops object
2个回答
0
投票

通过迭代 reduce

 数组来使用 
data

对于数组中的每个对象,检查累加器对象中是否已存在
id
的条目 (
acc
):

  • 如果没有,请使用空值数组创建一个新条目。
  • 如果是,将当前对象的values数组连接到累加器中现有的values数组。

最后使用

Object.values()
将累加值提取为数组并将其分配给结果变量

let data = [
    { "id": "12", "values": [ "_status.com", "_verify.com" ] },
    { "id": "12", "values": [ "_result.com"] },
    { "id": "15", "values": [ "_integrate.com"] }
];

let result = Object.values(data.reduce((acc, {id, values}) => {
    if (!acc[id]) {
        acc[id] = { id, values: [] };
    }
    acc[id].values = acc[id].values.concat(values);
    return acc;
}, {}));

console.log(result);


0
投票

您还可以

Object.groupBy
id
然后
map()
对象来组合
values

let data = [
    { "id": "12", "values": [ "_status.com", "_verify.com" ] },
    { "id": "12", "values": [ "_result.com"] },
    { "id": "15", "values": [ "_integrate.com"] }
]

const grouped = Object.groupBy(data, s => s.id);
const combined = Object.keys(grouped).map(id => (
    { id, values: grouped[id].flatMap(f => f.values) }
));

console.log(combined);


// Same as above, but as an one-liner
const result = Object.keys(Object.groupBy(data, s => s.id)).map(id => ({ id, values: grouped[id].flatMap(f => f.values) }));

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