Discord.js如何对JSON文件money字段降序排序 解决slice报错问题
问题排查与解决
核心错误原因
slice和sort是JavaScript数组的专属方法,你解析JSON得到的money不是数组类型,而是普通对象甚至是JSON解析失败的异常值,因此调用这两个方法会报错,同时排序逻辑也无法生效。
修复步骤
1. 修正JSON文件格式
你当前的JSON内容不符合语法规范,推荐调整为以用户ID为键的单对象格式(适配Discord用户数据存储场景),修改后的money.json内容如下:
{ "2858236346346": {"name":"user1","money":100}, "346342356347436": {"name":"user2","money":1000} }
如果偏好数组格式,也可以在外层包裹方括号,同时补充ID字段:
[ {"id":"2858236346346", "name":"user1","money":100}, {"id":"346342356347436", "name":"user2","money":1000} ]
2. 调整代码适配数据格式
如果使用推荐的单对象存储格式,需要先将对象转换为带用户ID的数组,再执行排序逻辑,修改后的代码如下:
execute(client, message, args) { let rawdata = fs.readFileSync('./money.json'); let money = JSON.parse(rawdata); // 将对象转换为带用户ID的数组,适配后续查成员逻辑 const moneyList = Object.entries(money).map(([userId, userData]) => ({ id: userId, ...userData })); // 执行降序排序,不需要加slice如果不需要保留原数组 const res = moneyList.sort((a, b) => b.money - a.money); console.log(res); let embed = new Discord.MessageEmbed() .setTitle("Najbogatsi Gracze") // 后续原有逻辑保持不变 if (res.length === 0) { embed.setColor("RED"); embed.setThumbnail("https://i.imgur.com/pWHpi7G.png"); embed.addField("Nie znaleziono danych", "Wpisz na czacie $daily aby zdobyć pieniądze!") } else if (res.length < 10) { embed.setColor("BLURPLE"); embed.setThumbnail("https://i.imgur.com/pWHpi7G.png"); for (i = 0; i < res.length; i++) { let member = message.guild.members.cache.get(res[i].id) || "Brak danych" if (member === "Brak danych") { embed.addField(`${i + 1}. ${member}`, `**Kasa:**: ${res[i].money}zł`); } else { embed.addField(`${i + 1}. ${member.user.username}`, `**Kasa:**: ${res[i].money}zł`); } } } // 剩余原有逻辑... }
如果使用数组格式的JSON,直接对解析得到的money数组执行排序即可,不需要做对象转数组的处理。
其他注意事项
- 你之前写的排序回调如果用大括号包裹逻辑,必须手动return差值,否则排序不会生效,两种正确写法二选一:
// 简写写法:无大括号自动返回 .sort((a,b) => b.money - a.money) // 完整写法:大括号加return .sort((a,b) => {return b.money - a.money}) sort方法会直接修改原数组,如果需要保留原数组的原始顺序,再使用slice()做浅拷贝:moneyList.slice().sort(...)- 读取本地JSON文件建议增加try catch捕获异常,避免非法JSON直接导致程序崩溃。
内容的提问来源于stack exchange,提问作者Kejlo
相关产品推荐
相关产品推荐

