如果语句不适用于JSON数组

时间:2019-02-09 23:43:58

标签: node.js discord discord.js

我有一个包含2个不一致的客户端ID`{

的JSON文件
{
       "premium": [
         "a random string of numbers that is a client id",
         "a random string of numbers that is a client id"
         ]
}

我试图使用for循环+ if语句访问这些​​客户端ID,以在程序中执行操作:

for(i in premium.premium){
      if(premium.premium[i] === msg.author.id){
        //do some stuff
      }else{
       //do some stuff

运行该程序时,它将运行for循环并首先转到else并在其中运行代码(不应该发生),然后在if中运行两次代码。但是只有2个客户端ID,并且for循环已经运行了3次,即使发送消息的人的JSON文件中包含了客户端ID,for循环也第一次运行到其他客户端。

如何解决此问题?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

您可能想在for循环中添加一个return语句。否则,循环将继续运行,直到满足条件为止,否则将无其他循环。参见documentation on for loops here

例如,这里没有return语句:

const json = {
  "premium": [
    "aaa-1",
    "bbb-1"
  ]
}

for (i in json.premium) {
  if (json.premium[i] === "aaa-1") {
    console.log("this is aaa-1!!!!")
  } else {
    console.log("this is not what you're looking for-1...")
  }
}

这里是return语句:

const json = {
  "premium": [
    "aaa-2",
    "bbb-2"
  ]
}

function loopOverJson() {
for (i in json.premium) {
  if (json.premium[i] === "aaa-2") {
    console.log("this is aaa-2!!!!")
    return
  } else {
    console.log("this is not what you're looking for-2...")
    return
  }
}
}

loopOverJson()

注意:如果不将以上内容包装在函数中,则控制台将显示:“语法错误:非法的返回语句”。

答案 1 :(得分:0)

for(i in premium.premium){
   if(premium.premium[i] === msg.author.id){
      //do some stuff
   } else{
       //do some stuff
   }
}

1)它将遍历所有premium.premium条目。如果有3个条目,它将执行3次。如果要在找到匹配项后退出循环,可以使用break语句。

2)您应该检查msg.author.id的类型。由于您使用的是严格比较运算符===,如果您msg.author.id是整数(因为您正在与字符串进行比较)(基于提供的json),它将评估为 false

使用隐式强制转换:if (premium.premium[i] == msg.author.id)
使用显式强制转换:if (premium.premium[i] === String(msg.author.id))

答案 2 :(得分:0)

解决此类问题的真正有趣且简单的方法是使用内置的Array方法,例如map,reduce或filter。然后,您不必担心迭代器的值。

例如

const doSomethingAuthorRelated = (el) => console.log(el, 'whoohoo!');

const authors = premiums
                 .filter((el) => el === msg.author.id)
                 .map(doSomethingAuthorRelated);

正如John Lonowski在评论链接中指出的那样,在JavaScript数组中使用for ... in是不可靠的,因为它旨在迭代Object属性,因此您不能真正确定对其进行迭代,除非您这样做。已经清楚地定义了数据,并且在一个您不知道其他库会破坏Array对象的环境中工作。