javascript - 将 javascript 对象从一种形式转换为另一种形式
问题描述
我有一个团队对象列表,其中包含团队名称、报告者和该团队每天的状态列表,我想将其转换为基于日期的对象列表,其中包含所有团队及其相应日期的状态。
我已经尝试过这样的事情,但没有给出预期的结果。
teams.map(team => ({
day: team.statuses.reduce((acc, it) => it.day),
teams: {
teamName: team.teamName
}
}))
[
{
"teamName":"abc",
"reportedBy": "user1",
"statuses":[
{
"day":"10/12",
"status":"green"
},
{
"day":"10/11",
"status":"green"
},
{
"day":"10/09",
"status":"green"
}
]
},
{
"teamName":"xyz",
"reportedBy": "user2",
"statuses":[
{
"day":"10/12",
"status":"red"
},
{
"day":"10/11",
"status":"red"
},
{
"day":"10/09",
"status":"red"
}
]
}
]
预期输出:
[
{
"day": "1012",
"teams": [
{
"teamName": "abc",
"reportedBy": "user1",
"status": "green"
},
{
"teamName": "xyz",
"reportedBy": "user2",
"status": "red"
}
]
},
{
"day": "1011",
"teams": [
{
"teamName": "abc",
"reportedBy": "user1",
"status": "green"
},
{
"teamName": "xyz",
"reportedBy": "user2",
"status": "red"
}
]
},
{
"day": "1009",
"teams": [
{
"teamName": "abc",
"reportedBy": "user1",
"status": "green"
},
{
"teamName": "xyz",
"reportedBy": "user2",
"status": "red"
}
]
}
]
解决方案
我不认为 reduce 是这里的最佳选择。我认为最好创建一个空数组并随时填充:
let input = [
{
"teamName":"abc",
"reportedBy": "user1",
"statuses":[
{
"day":"10/12",
"status":"green"
},
{
"day":"10/11",
"status":"green"
},
{
"day":"10/09",
"status":"green"
}
]
},
{
"teamName":"xyz",
"reportedBy": "user2",
"statuses":[
{
"day":"10/12",
"status":"red"
},
{
"day":"10/11",
"status":"red"
},
{
"day":"10/09",
"status":"red"
}
]
}
];
let output = [];
input.forEach(team =>
{
let name = team.teamName;
let reporter = team.reporter
team.statuses.forEach(status =>
{
let dayItem = output.find(item => item.day == status.day);
if(dayItem == null)
{
let newItem = {day: status.day, teams:[{status: status.status, reportedBy: reporter, teamName: name}]};
output.push(newItem);
}
else
{
dayItem.teams.push({status: status.status, reportedBy: reporter, teamName: name})
}
});
});
console.log(JSON.stringify(output));