我正在try 实现一个相当复杂的迭代,但到目前为止还没有成功地使用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在两个对象中重复两次.当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 },
},
],
}
有没有人能告诉我如何准确地实现这一点.下面是我如何try 使用reduce,我已经达到了一半.唯一的事情我无法得到的是我如何总结tests
属性时,id是匹配的,并获得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
}, {}))
}]