[英]How to group array of objects by multiple keys with and without Lodash?
export default [
{
id: 101,
league: {
id: "500",
name: "EU Champions League"
},
group: {
id: "990",
name: "Group A"
}
},
{
id: 102,
league: {
id: 600,
name: "Super Lig"
}
},
{
id: 103,
league: {
id: 500,
name: "EU Champions League"
}
},
{
id: 104,
league: {
id: 500,
name: "EU Champions League"
}
},
{
id: 105,
league: {
id: 500,
name: "EU Champions League"
},
group: {
id: "991",
name: "Group B"
}
},
{
id: 106,
league: {
id: 500,
name: "EU Champions League"
},
group: {
id: "991",
name: "Group B"
}
}
];
這是一個現場演示,但與我期望的相差甚遠,可以參考以確定我正在嘗試做什么並且顯然失敗了!
https://codesandbox.io/s/js-group-array-of-object-by-multiple-keys-8b4s0
對象數組如下所示;
我想要做的是將具有相同聯賽 ID 的和具有相同聯賽 ID + 組名的組分組,將其作為對象輸出,其中對象鍵是“聯賽 ID + 組 ID”(需要時); 所以它變成了這樣;
{
// All objects with league id 500 and group A
'500-990': [{
id: 101,
league: {
id: "500",
name: "EU Champions League"
},
group: {
id: "990",
name: "Group A"
}
}],
// All objects with league id 600
'600': [{
id: 102,
league: {
id: 600,
name: "Super Lig"
}
}],
// All objects with league id 500 only with NO groups
'500': [{
id: 103,
league: {
id: 500,
name: "EU Champions League"
}
},
{
id: 104,
league: {
id: 500,
name: "EU Champions League"
}
}],
// All objects with league id 500 and group B
'500-991': [{
id: 105,
league: {
id: 500,
name: "EU Champions League"
},
group: {
id: "991",
name: "Group B"
}
},
{
id: 106,
league: {
id: 500,
name: "EU Champions League"
},
group: {
id: "991",
name: "Group B"
}
}],
}
基本上根據組是否存在創建密鑰,如果存在,則將組字母添加到末尾並創建數組。
const groupById = (arr) => { let resp = {}; for (const val of arr) { const key = val.group ? val.league.id + '-' + val.group.name.slice(-1).toLowerCase() : val.league.id; if (!resp[key]) { resp[key] = [val]; } resp[key].push(val); } return resp; } const input = [{ id: 101, league: { id: "500", name: "EU Champions League" }, group: { id: "990", name: "Group A" } }, { id: 102, league: { id: 600, name: "Super Lig" } }, { id: 103, league: { id: 500, name: "EU Champions League" } }, { id: 104, league: { id: 500, name: "EU Champions League" } }, { id: 105, league: { id: 500, name: "EU Champions League" }, group: { id: "991", name: "Group B" } }, { id: 106, league: { id: 500, name: "EU Champions League" }, group: { id: "992", name: "Group B" } }]; console.log(groupById(input));
如有必要,您可以使用組合鍵並按此值分組。
const data = [{ id: 101, league: { id: "500", name: "EU Champions League" }, group: { id: "990", name: "Group A" } }, { id: 102, league: { id: 600, name: "Super Lig" } }, { id: 103, league: { id: 500, name: "EU Champions League" } }, { id: 104, league: { id: 500, name: "EU Champions League" } }, { id: 105, league: { id: 500, name: "EU Champions League" }, group: { id: "991", name: "Group B" } }, { id: 106, league: { id: 500, name: "EU Champions League" }, group: { id: "992", name: "Group B" } }], result = data.reduce((r, o) => { const key = o.group ? [o.id, o.group.name].join('-') : o.id; (r[key] ??= []).push(o); return r; }, {}); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.