【问题标题】:Accessing an object with a variable that is a string. Javascript使用字符串变量访问对象。 Javascript
【发布时间】:2018-01-24 00:48:20
【问题描述】:

这是我正在尝试创建的不和谐机器人的代码:

const Discord = require('discord.js');
const config = require("./config.json");
const bot = new Discord.Client();

var prefix = '!';
var allqueues = [];

function queue(game,pplneeded,tag){
    this.game = game;
    this.pplneeded = pplneeded;
    this.ppljoined = 1;    
    this.tag = tag;
    allqueues.push(tag);
}
bot.on('message',(message) => {
    if(message.content.startsWith(prefix+'prefix')){
        var member = message.mentions.members.first();

        prefix=(message.content).split(" ")[1];
        message.channel.send('The command prefix has been set to '+(message.content).split(/\s+/g)[1] + ' .');
}
if(message.content == (prefix+'rules')){
    message.channel.send('I\'ll keep these rules short and sweet, \'cuz this is just a casual gaming server. \n No spamming. Alright, that\'s it.');
}
if(message.content == (prefix+'help')){
    message.channel.send('Simply type **' + prefix + 'q** ***game people_needed tag*** to create a queue, and **' + prefix + 'j** ***tag*** to join a queue.');
    message.channel.send('Type **' + prefix + 'eq** ***tag*** to exit a queue, and **' + prefix + 'd** ***tag*** to dismantle a queue.');
    message.channel.send('Type **' + prefix + 'inf** ***tag*** to find info about a queue.');
}
if(message.content.startsWith(prefix+'q')){
    var a = message.content.split(/\s+/g);
    a[3] = new queue(a[1],a[2],a[3]);
    message.channel.send(a[1]+' '+a[2]+' '+a[3].tag);
    message.channel.send('A new queue was made! Type **' + prefix + 'j ' + a[3].tag + '** to join this '+a[1]+' queue!')
    message.channel.send(allqueues);
}
if(message.content.startsWith(prefix+'j')){
    var b = message.content.split(/\s+/g);
    if (b[2]=undefined){
        message.channel.send('That\'s not a valid tag!') 
        return;
    }else{
        b[2].ppljoined=b[2].ppljoined+1;
        message.channel.send(message.author + ' has joined the ' + b[2] + 'queue!~~');
        if (b[2].ppljoined==b[2].pplneeded){
            message.channel.send(b[2] + ' has all the needed people!');
            index = allqueues.indexOf(b[2])
            allqueues.splice(index, 1);
        }
    }

}
});

bot.login(config.token);

问题是我不知道如何使用“b”数组访问其中一个对象。如您所见,我尝试使用b[3],但这无济于事。请帮忙。如果它可能会有所启发,这是我在机器人所在的不和谐服务器中输入!q game 5 tagyoureit 然后!j tagyoureit 时的错误文本:

C:\Users\----\Desktop\gamebot\index.js:42
        b[2].ppljoined=b[2].ppljoined+1;
                           ^

TypeError: Cannot read property 'ppljoined' of undefined
    at Client.bot.on (C:\Users\----\Desktop\gamebot\index.js:42:32)
    at emitOne (events.js:115:13)
    at Client.emit (events.js:210:7)
    at MessageCreateHandler.handle (C:\Users\----\Desktop\gamebot\node_modules\discord.js\src\client\websocket\packets\handlers\M
essageCre
ate.js:9:34)
at WebSocketPacketManager.handle (C:\Users\----\Desktop\gamebot\node_modules\discord.js\src\client\websocket\packets\WebSocketP
acketMa
nager.js:102:65)
at WebSocketConnection.onPacket (C:\Users\----\Desktop\gamebot\node_modules\discord.js\src\client\websocket\WebSocketConnection.js:325
:35)
    at WebSocketConnection.onMessage (C:\Users\--\Desktop\gamebot\node_modules\discord.js\src\client\websocket\WebSocketConnectio
n.js:28
8:17)
    at WebSocket.onMessage (C:\Users\----
\Desktop\gamebot\node_modules\ws\lib\EventTarget.js:103:16)
    at emitTwo (events.js:125:13)
    at WebSocket.emit (events.js:213:7)

【问题讨论】:

标签: javascript bots discord discord.js


【解决方案1】:

Javascript 中的数组是零索引的,这意味着数组中的第一个元素位于索引0,第二个元素位于索引1,依此类推。由于您正在寻找b 数组中的第二个元素,因此您需要b[1] 而不是b[2]

【讨论】:

  • 感谢您在第二部分提醒我。但是,仍然存在一个问题:Cannot read property 'ppljoined' of undefined。那你怎么读呢?
  • 好吧,如果没有提供密钥,你要检查b[1] == undefined 不是b[1] = undefined。此外,还有另一个问题,每次调用message.content.split 时,它都会创建一个new 对象。您可能希望存储一个包含每个标签的键的全局对象。这样,您不会在每次调用 bot.on 时丢失 ppljoined 的值
  • 保存标签的全局对象在allqueues,这是一个保存所有对象的数组。
【解决方案2】:

b 数组中有多少个元素?拆分message.content后尝试console.log(b)以确保。

此外,如果 b[2] 未定义,则代码应该进入 if 语句,但您在 if (b[2]=undefined){ 语句中有错字(只有一个等号)。尝试将其更改为if (b[2] == undefined){ 或只是if (b[2]){

【讨论】:

  • b 中有两项,但现在我已将所有b[2] 更改为b[1],因为这将访问第二个元素。即使我修复了这些问题,当我尝试阅读 b[1].pplneeded 时,我也会得到 undefined,就像我尝试阅读 b[1].ppljoined 时一样。
  • 您能否显示console.log(b) 的输出并使用您当前的代码更新您发布的代码?
  • 没关系。我又修改了一些,现在我正在测试一个可能的解决方案:创建一个全局对象var tags:{},然后当我想添加它时,我只需将其设置为tags[(tagname)]={object stuff}。我不确定它是否会起作用。
【解决方案3】:

b[2] = undefined 是一个赋值,而不是一个表达式。将此更改为b[2] === undefined(或!!B[2]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2014-09-21
    • 2011-05-14
    • 2011-02-12
    相关资源
    最近更新 更多