我有一个包含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循环也第一次运行到其他客户端。
如何解决此问题?任何帮助将不胜感激。
答案 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对象的环境中工作。