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

如何将字符串转为Discord.js v14 .SetChoices()可用的多对象集合

解决Discord机器人.setChoices()的动态选项转换问题

核心实现方案

你的需求是把非标准对象字符串转成Discord.js可识别的格式,同时实现外部文件动态加载选项,避免重复修改。以下是具体可行的操作步骤:

  • 修正字符串为标准JSON格式
    原始字符串的属性名未加双引号,不符合JSON规范,必须先补上:

    // 原始字符串
    const rawStr = '{ name:"All", value:"All"},{ name:"Home", value:"Home" },{ name:"Coding", value:"Coding" }';
    // 替换属性名为带双引号的格式,再包裹成数组JSON字符串
    const validJsonStr = `[${rawStr.replace(/(\w+):/g, '"$1":')}]`;
    
  • 解析为对象数组
    用JSON.parse()把修正后的字符串转成对象数组:

    const choices = JSON.parse(validJsonStr);
    
  • 传入.setChoices()方法
    Discord.js的.setChoices()支持用扩展运算符...展开数组,直接把数组里的每个对象传入:

    // 示例:基于SlashCommandBuilder构建命令
    const { SlashCommandBuilder } = require('discord.js');
    const command = new SlashCommandBuilder()
      .setName('你的命令名')
      .setDescription('你的命令描述')
      .addStringOption(option => 
        option.setName('选项名')
          .setDescription('选项描述')
          .setChoices(...choices) // 展开数组传入选项
      );
    

更省心的外部JSON优化方案

如果要直接从外部文件加载选项,建议把选项存成标准JSON数组文件(比如choices.json):

[
  {"name":"All","value":"All"},
  {"name":"Home","value":"Home"},
  {"name":"Coding","value":"Coding"}
]

然后在代码里读取解析:

const fs = require('fs');
// 读取并解析JSON文件
const choices = JSON.parse(fs.readFileSync('./choices.json', 'utf8'));
// 直接用扩展运算符传入setChoices
command.addStringOption(option => 
  option.setName('选项名')
    .setDescription('选项描述')
    .setChoices(...choices)
);

这样修改choices.json后,重启机器人就能自动加载新选项,完全不用改动代码里的对象定义。

你想要的“单个变量等价于多个对象集合”就是这个choices数组,用扩展运算符展开后,效果和手动写每个对象完全一致,.setChoices()能正确识别每个元素为独立选项。

内容的提问来源于stack exchange,提问作者user18272152

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:05:27