如何将字符串转为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
相关产品推荐
相关产品推荐

