JavaScript+discord.js:如何使用对象's在另一个对象中的属性存储在同一对象中



所以我正在制作一个机器人来托管Discord RPG,我正在制作玩家数据存储。我遇到了一些统计数据的问题,需要存储在另一个对象中的玩家级别来计算它自己的值。当我在PowerShell中运行该程序时,当我必须使用该变量时,它返回TypeError: Cannot read property 'level' of undefined。我该如何解决这个问题?

const fs = require('fs');
var userData = JSON.parse(fs.readFileSync('userData.json', 'utf8'));
client.once('ready', () => {
console.log('Ready!');
});
client.on('message', message => {
if (!userData[message.author.id]) {
level: {
lvl: 0,
exp: 0,
lvlupreq: 100
},
stats: {
maxhp: 200 + userData[message.author.id].level.lvl * 5,
hp: 200,
atk: 5 + userData[message.author.id].level.lvl,
def: 5 + userData[message.author.id].level.lvl,
planet: 1
},
}
});

您无意中创建了带标签的语句,而不是创建对象并向其添加属性。

如果userData[message.author.id]不存在,您首先需要使用初始值创建它:

if (!userData[message.author.id]) {
userData[message.author.id] = {
level: {
lvl: 0,
exp: 0,
lvlupreq: 100,
},
stats: {
maxhp: 200,
hp: 200,
atk: 5,
def: 5,
planet: 1,
},
}
}

统计数据更新可能必须为所有用户完成,这取决于您的进一步逻辑(在示例代码中并不是真正必要的(:

Object.assign(userData[message.author.id].stats, {
maxhp: 200 + userData[message.author.id].level.lvl * 5,
atk: 5 + userData[message.author.id].level.lvl,
def: 5 + userData[message.author.id].level.lvl,
});

在这种情况下使用Object.assign相当于为每个属性编写一个赋值:

userData[message.author.id].stats.maxhp = 200 + userData[message.author.id].level.lvl * 5;
userData[message.author.id].stats.atk = 5 + userData[message.author.id].level.lvl;
userData[message.author.id].stats.def = 5 + userData[message.author.id].level.lvl;

最新更新