在javascript中按结构化对象中的2个键进行分组

问题描述 投票:0回答:1

我有一个名为 weeklySchedule 的 JavaScript 数组,它从 API 调用中返回。我的数据的简短示例是:

[
{
        "PlayerNumber": 1,
        "TeeOff": 1,
        "WeekNumber": 1,
        "PlayerName": {
            "FirstName": "Bob",
            "LastName": "Jones"
        }
    }, {
        "PlayerNumber": 2,
        "TeeOff": 1,
        "WeekNumber ": 1,
        "PlayerName": {
            "FirstName": "Dave",
            "LastName": "Wilson"
        }
    }, {
        "PlayerNumber": 3,
        "TeeOff": 2,
        "WeekNumber ": 1,
        "PlayerName": {
            "FirstName": "Homer",
            "LastName": "Simpson"
        }
    }, {
        "PlayerNumber": 4,
        "TeeOff": 2,
        "WeekNumber ": 1,
        "PlayerName": {
            "FirstName": "Lisa",
            "LastName": "Simpson"
        }
    }
]

...该数据持续数周和多个开球时间值

我想按 WeekNumber 和 TeeOff 对它们进行分组,然后按这两个键对它们进行排序,首先按 WeekNumber,然后按 TeeOff。我通过工作拥有了这个小组:

const groupedPlayers=Object.groupBy(weeklySchedule,
    function (item) {
        const group = [item.WeekNumber, item.TeeOff];
        return group;
    });

但是,当我迭代这些时,即使数据已预先排序,顺序也是不确定的,例如:

for (const key in groupedPlayers) {
 //the key is not in any expected order
}

我已经进行了高低搜索,阅读了数十个示例,但我所看到的没有任何内容会按 2 个单独的属性进行分组和排序。你能帮忙吗?!

javascript group-by
1个回答
0
投票

您可以将玩家分组到 2 个嵌套对象中。由于您的排序值是数字,因此它们将自动排序!然后您可以将分组的数据转换为您想要的任何格式。例如,我已经转换为周数数组和开球嵌套数组,因为我发现使用数组最有用(您可以对数据使用数组方法):

const arr = [
{
        "PlayerNumber": 1,
        "TeeOff": 1,
        "WeekNumber": 1,
        "PlayerName": {
            "FirstName": "Bob",
            "LastName": "Jones"
        }
    }, {
        "PlayerNumber": 2,
        "TeeOff": 1,
        "WeekNumber": 2,
        "PlayerName": {
            "FirstName": "Dave",
            "LastName": "Wilson"
        }
    }, {
        "PlayerNumber": 3,
        "TeeOff": 2,
        "WeekNumber": 1,
        "PlayerName": {
            "FirstName": "Homer",
            "LastName": "Simpson"
        }
    }, {
        "PlayerNumber": 4,
        "TeeOff": 2,
        "WeekNumber": 2,
        "PlayerName": {
            "FirstName": "Lisa",
            "LastName": "Simpson"
        }
    }
]

const grouped = arr.reduce((r, item) => (((r[item.WeekNumber] ??= {})[item.TeeOff] ??= []).push(item), r), {});
console.log(grouped);
const result = Object.entries(grouped).map(([WeekNumber, teeOffs]) => 
({WeekNumber, TeeOffs: Object.entries(teeOffs).map(([TeeOff, Players]) => ({TeeOff, Players}))}));

console.log(result);
.as-console-wrapper{max-height:100%!important}

© www.soinside.com 2019 - 2024. All rights reserved.