這個問題在這里已經有了答案: 使用物件對陣列項進行分組 (18 個回答) 展平陣列中的物件 6 個回答 15 小時前關閉。
我有一些非理想格式的資料,我想將其展平。
資料:
[
{
team: "Team 1",
name: "John"
},
{
team: "Team 1",
name: "Stacy"
},
{
team: "Team 1",
name: "Jason"
},
{
team: "Team 2",
name: "Tim"
},
{
team: "Team 2",
name: "Andrew"
},
{
team: "Team 2",
name: "Steve"
}
,
{
team: "Team 3",
name: "Eric"
},
{
team: "Team 3",
name: "Frank"
},
{
team: "Team 3",
name: "Cory"
}
]
想要的結果是:
[
{
team: "Team 1",
name: ["John", "Stacy", "Jason"],
count: 3
},
{
team: "Team 2",
name: ["Tim", "Andrew", "Steve"],
count: 3
},
{
team: "Team 3",
name: ["Eric", "Frank", "Cory"],
count: 3
}
]
我試過遍歷它并使用它,Object.assing但這似乎是不正確的方法。關于扁平化這些資料的好方法有什么建議嗎?謝謝
uj5u.com熱心網友回復:
您可以使用Array.reduce.
在 reducer 函式中,檢查累加器是否包含具有相同team屬性的項。如果是這樣,增加它的count屬性并將當前專案的name屬性推送到它的name屬性。
const arr=[{team:"Team 1",name:"John"},{team:"Team 1",name:"Stacy"},{team:"Team 1",name:"Jason"},{team:"Team 2",name:"Tim"},{team:"Team 2",name:"Andrew"},{team:"Team 2",name:"Steve"},{team:"Team 3",name:"Eric"},{team:"Team 3",name:"Frank"},{team:"Team 3",name:"Cory"}];
const res = arr.reduce((a,b) => {
let itm = a.find(e => e.team == b.team);
if(itm){
itm.count ;
itm.name.push(b.name);
}else{
a.push({team: b.team, name: [b.name], count:1})
}
return a;
}, [])
console.log(res)
更有效的解決方案:
const arr=[{team:"Team 1",name:"John"},{team:"Team 1",name:"Stacy"},{team:"Team 1",name:"Jason"},{team:"Team 2",name:"Tim"},{team:"Team 2",name:"Andrew"},{team:"Team 2",name:"Steve"},{team:"Team 3",name:"Eric"},{team:"Team 3",name:"Frank"},{team:"Team 3",name:"Cory"}];
const obj = arr.reduce((a,b) => {
let itm = a[b.team]
if(itm){
itm.count ;
itm.name.push(b.name);
}else{
a[b.team] = {team: b.team, name: [b.name], count: 0}
}
return a;
}, {})
const res = Object.keys(obj).map(e => obj[e])
console.log(res)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/387252.html
