[英]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"
}
}
];
Here is a live demo, but it's nowhere near what I'm expecting it, it's good for reference to determine what I'm trying to do and obviously failed!这是一个现场演示,但与我期望的相差甚远,可以参考以确定我正在尝试做什么并且显然失败了!
https://codesandbox.io/s/js-group-array-of-object-by-multiple-keys-8b4s0 https://codesandbox.io/s/js-group-array-of-object-by-multiple-keys-8b4s0
The array of objects looks like this;对象数组如下所示;
What I'm trying to do is grouping ones with same league id and ones with same league id + group name, outputting it as an object where object key is the 'league id + group id' (where needed);我想要做的是将具有相同联赛 ID 的和具有相同联赛 ID + 组名的组分组,将其作为对象输出,其中对象键是“联赛 ID + 组 ID”(需要时); So it becomes like so;
所以它变成了这样;
{
// 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"
}
}],
}
Basically creating the key based on if group exists, if it does then add on the group letter to the end and create the array.基本上根据组是否存在创建密钥,如果存在,则将组字母添加到末尾并创建数组。
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));
You could take a combined key, if necessary and group by this value.如有必要,您可以使用组合键并按此值分组。
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.