You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:36:03