我正在尝试实现一个相当复杂的迭代,但到目前为止使用reduce 还没有成功。这是一个小例子
输入如下
let input = {
"data": [
{
"state": "CA",
"tests": 12,
"city": [ "Mountain View"],
"metadata": { "id": 15 },
},
{
"state": "TX",
"tests": 10,
"city": [ "Austin" ],
"metadata": { "id": 15 },
},
{
"state": "AZ",
"tests": 5,
"city": [ "Flagstaff" ],
"metadata": { "id": 10 },
},
],
}
正如您可以清楚地看到的,id 在 2 个对象中重复了两次。我想当 id 相同时将这两个对象连接成一个。因此,如果有 3 个具有相同 id 的对象,我想将 3 个对象连接为一个。除此之外,我还想在 id 匹配时将州和城市属性连接起来。当 id 匹配时,
tests
也应该相加。
所以我的最终输出应该是这样的
let result = {
"data": [
{
"state": ["CA", "TX"],
"tests": 22,
"city": ["Mountain View", "Austin"],
"metadata": { "id": 15 },
},
{
"state": "AZ",
"tests": 5,
"city": [ "Flagstaff" ],
"metadata": { "id": 10 },
},
],
}
有人可以让我知道如何精确实现这一目标吗?这是我尝试使用reduce的方法,我已经完成了一半。我唯一无法得到的是当 id 匹配时我如何总结
tests
属性并在这种情况下使 tests
总数为 22。
let total_tests = 0;
let res = [{
data: Object.values(input[0].data.reduce((acc, {state, city, metadata, tests, category
}) => {
const id = metadata ? .id;
if (!acc[id]) {
acc[id] = {
id,
state: [],
city: [],
metadata,
tests,
category
}
}
acc[id].state.push(state)
acc[id].city.push(...city)
debugger
acc[id].tests = total_tests + acc[id].tests;
return acc
}, {}))
}]
您可以使用
tests: 0
初始化对象并添加实际值。
let input = {
"data": [{
"state": "CA",
"tests": 12,
"city": ["Mountain View"],
"metadata": {
"id": 15
},
},
{
"state": "TX",
"tests": 10,
"city": ["Austin"],
"metadata": {
"id": 15
},
},
{
"state": "AZ",
"tests": 5,
"city": ["Flagstaff"],
"metadata": {
"id": 10
},
},
],
}
let res = [{
data: Object.values(input.data.reduce((acc, { state, city, metadata, tests }) => {
const id = metadata?.id;
acc[id] ??= { id, state: [], city: [], metadata, tests: 0 };
acc[id].state.push(state)
acc[id].city.push(...city)
acc[id].tests += tests;
return acc
}, {}))
}];
console.log(res);