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

使用fs.writeFile写入JSON时,键名未替换为变量值的问题求助

解决Discord.js中fs.writeFile生成JSON时键名未取变量值的问题

你遇到的问题是JavaScript对象字面量的一个常见细节:当你直接在对象里写TargetMemberID: { ... }时,JavaScript会把TargetMemberID当作字符串键名,而不是读取变量TargetMemberID的值。要让键名使用变量的内容,你需要用计算属性名(用方括号包裹变量)。

错误原因分析

你之前尝试的data[message.guild.id[TargetMember.id]]写法完全偏离了正确思路——这相当于把message.guild.id当作数组,去取索引为TargetMember.id的值,显然不符合你的需求。正确的逻辑应该是:先定位到data[message.guild.id]这个对象,然后给它添加一个以TargetMemberID变量值为键的属性。

修正后的代码

把你赋值的那行代码改成下面这样:

const TargetMemberID = TargetMember.id;
// 使用计算属性名 [TargetMemberID] 来将变量值作为键名
data[message.guild.id] = { 
  [TargetMemberID]: { 
    Moderation: 'Kick', 
    Target: `${TargetMember.user.tag}`, 
    Moderator: `${message.author.tag}`, 
    Reason: `${Reason}`, 
    ID: `#${ID}` 
  } 
};
fs.writeFile("./data.json", JSON.stringify(data, null, 2), (err) => { 
  if (err) console.log(err); 
});

我还在JSON.stringify里加了null, 2参数,这样生成的JSON会格式化缩进,方便后期查看和调试。

验证效果

修改后,生成的JSON就会和你期望的结构完全一致:

{"726623241984278589": {"322366672625467392": {"Moderation": "Kick", "Target": "Bobo#1601", "Moderator": "Bobosky#3914", "Reason": "Testing", "ID": "#XLR6RV8M"}}}

其实这个小技巧是ES6引入的特性,专门用来解决“用变量作为对象键名”的场景,记住它以后就能轻松避开这类坑啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:01:43