Javascript discord.js 排行榜

问题描述

所以现在我正在尝试制作 XP 排行榜,但我很困。我能够将它放在将 XP 放置的位置,但我无法弄清楚如何使用 XP 来按顺序传递其他信息,例如用户名等。老实说,我可能正朝着完全错误的方向前进。我现在的代码是:

        let obj = {
            '737903775691309127': {
                authorid: '737903775691309127',username: 'Vibe Development',serverID: '789259215868395552',xp: 391,level: 1,message: 50,avatarURL: 'https://cdn.discordapp.com/avatars/737903775691309127/91fa0efafb801dcbea4a669a67c6602e.webp'
            },'455139054464270345': {
                authorid: '455139054464270345',username: 'Crispy Cream',xp: 753,level: 2,message: 99,avatarURL: 'https://cdn.discordapp.com/avatars/455139054464270345/a_9ab406e25e688594f8316909f0c470b5.gif'
            },'738418475801772072': {
                authorid: '738418475801772072',username: 'Starpower11',xp: 13,message: 1,avatarURL: 'https://cdn.discordapp.com/avatars/738418475801772072/a577da70ee54c036643490a6928b026e.webp'
            },'270904126974590976': {
                authorid: '270904126974590976',username: 'Dank Memer',xp: 8,avatarURL: 'https://cdn.discordapp.com/avatars/270904126974590976/d60c6bd5971f06776ba96497117f7f58.webp'
            },'838650739403390976': {
                authorid: '838650739403390976',username: 'Vibe Testing',avatarURL: 'https://cdn.discordapp.com/avatars/838650739403390976/930052efdecd2dd4ef7fd2a636949979.webp'
            },'432129282710700033': {
                authorid: '432129282710700033',username: 'Aero',xp: 14,avatarURL: 'https://cdn.discordapp.com/avatars/432129282710700033/8323250fe10eef177c35288e0b3b9bb8.webp'
            },'280497242714931202': {
                authorid: '280497242714931202',username: 'Yui',xp: 3,avatarURL: 'https://cdn.discordapp.com/avatars/280497242714931202/d1f617030b44cbc64cff2269da2c5e0c.webp'
            },'434556304661544960': {
                authorid: '434556304661544960',username: 'Waifu',xp: 29,message: 3,avatarURL: 'https://cdn.discordapp.com/avatars/434556304661544960/43e86c35225c23d46ae7db54bb81b8f8.webp'
            },'632293976661164052': {
                authorid: '632293976661164052',username: 'Paisley Park',message: 2,avatarURL: 'https://cdn.discordapp.com/avatars/632293976661164052/55146c900a44874dcb75d13df16ceb68.webp'
            },'368362411591204865': {
                authorid: '368362411591204865',username: 'Melijn',avatarURL: 'https://cdn.discordapp.com/avatars/368362411591204865/9326b331e0e42f185318bb305fdaa950.webp'
            },'716293342740348948': {
                authorid: '716293342740348948',username: 'Pokedi',xp: 32,avatarURL: 'https://cdn.discordapp.com/avatars/716293342740348948/2ef9cd6588c333a3299f694a23e4fa4d.webp'
            }
        };

        const res = await Object.values(obj);
        var levels = [];
        for (let index = 0; index < res.length; index++) {

            levels.push(res[index].xp);
        }
        levels.sort((a,b) => b - a);
        console.log(levels)
       // [ 753,391,32,29,14,13,8,3 ]

对象是:

let obj = {
            'userid': {
                authorid: 'userid',username: 'username',serverID: 'server id',avatarURL: 'users avatar'
            },

我也想得到的是返回的数组看起来像

            [
                {
                    authorid: '455139054464270345',avatarURL: 'https://cdn.discordapp.com/avatars/455139054464270345/a_9ab406e25e688594f8316909f0c470b5.gif'
                },{
                    authorid: '737903775691309127',avatarURL: 'https://cdn.discordapp.com/avatars/737903775691309127/91fa0efafb801dcbea4a669a67c6602e.webp'
                },... and so on 
            ]

希望这一切都有意义。谢谢!

解决方法

要获取按属性排序的对象数组(在本例中为 xp),而不仅仅是属性本身,您应该直接在 xp 属性上使用 Array.sort,而无需先创建 levels 数组。类似的东西:

const sortedObjects = 
    Object.values(obj) // get an array of the objects themselves
    .sort((a,b) =>
        b.xp - a.xp // sort by xp from greatest to least
    );

或者只是:

const sortedObjects = Object.values(obj).sort((a,b) => b.xp - a.xp)

将返回按其 xp 属性排序的对象数组。