如何遍历Discord用户ID键的JSON并按指定字段排序,保留关联数据
解决方案:排序用户统计数据并置顶指定用户
嘿,我帮你整理了一套完美的实现方案,完全贴合你的需求——不管是按字段排序、保留关联数据,还是把指定用户放在最顶部,都能轻松搞定!
步骤1:把键值对对象转成可排序的数组
因为你的JSON是以用户ID为键的对象,而对象本身没法直接排序,所以第一步我们要把它转换成[用户ID, 用户数据]格式的数组,用Object.entries()就能快速实现:
// 假设你的用户统计数据存在这个变量里 const userStats = { "350707981178109964":{"wins":1,"losses":0,"rank":4,"username":"TheeSniper95"}, "426459326031593482":{"wins":0,"losses":0,"rank":1,"username":"Ding Dang Test"}, "267752826623492102":{"wins":0,"losses":0,"rank":1,"username":"MrDooba"} }; // 转换为可排序的数组,每个元素是 [userId, userData] let sortedUsers = Object.entries(userStats);
步骤2:按指定字段排序
接下来就可以根据你需要的字段自定义排序逻辑了,比如按rank升序(rank越小越靠前),如果rank相同就按wins降序(赢的多的在前):
// 排序逻辑:先按rank从小到大,rank相同则按wins从大到小 sortedUsers.sort((a, b) => { // a[1] 和 b[1] 对应每个用户的wins、losses等关联数据 if (a[1].rank !== b[1].rank) { return a[1].rank - b[1].rank; // 升序:rank数值小的排前面 } else { return b[1].wins - a[1].wins; // 降序:wins数值大的排前面 } });
如果你只想单纯按wins从高到低排序,直接简化成:
sortedUsers.sort((a, b) => b[1].wins - a[1].wins);
步骤3:把指定用户置顶
最后一步,把你需要置顶的用户(比如当前消息的作者message.author.id,或者任意指定的用户ID)移到数组最顶部:
// 替换成你要置顶的用户ID,这里用discord.js的消息作者ID举例 const targetUserId = message.author.id; // 找到目标用户在数组中的位置 const targetIndex = sortedUsers.findIndex(([userId]) => userId === targetUserId); // 如果找到该用户,就把它从原位置移除并插入到数组开头 if (targetIndex !== -1) { const targetUserEntry = sortedUsers.splice(targetIndex, 1)[0]; sortedUsers.unshift(targetUserEntry); }
可选:生成并发送可视化排行榜
排序完成后,你可以把数组转换成易读的文本,比如在Discord频道里发送格式化的排行榜:
// 生成排行榜内容 const leaderboardText = sortedUsers.map(([userId, data], index) => { return `${index + 1}. ${data.username} | Rank: ${data.rank} | Wins: ${data.wins} | Losses: ${data.losses}`; }).join('\n'); // 发送到当前频道 message.channel.send(`📊 **用户排行榜**\n${leaderboardText}`);
这样处理后,你就能得到一个既按指定字段排序、又置顶了目标用户的结果,而且所有关联的用户数据(username、wins等)都完整保留啦!
内容的提问来源于stack exchange,提问作者Snips YT
相关产品推荐
相关产品推荐

