If 语句不适用于 JSON 数组
If statements not working with JSON array
我有一个包含 2 个不一致客户端 ID 的 JSON 文件`{
{
"premium": [
"a random string of numbers that is a client id",
"a random string of numbers that is a client id"
]
}
我尝试访问这些客户端 ID 以使用 for 循环 + if 语句在程序中执行操作:
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 次 运行,第一次运行时它会立即转到 else,即使发送消息的人的客户端 ID 在 JSON 文件。
我该如何解决这个问题?非常感谢任何帮助。
您可能想在 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()
注意:如果不将以上内容包装在函数中,控制台将显示:"Syntax Error: Illegal return statement."
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
是整数,它将评估为 false 因为您正在与字符串进行比较(基于您提供的json)。
使用隐式转换:if (premium.premium[i] == msg.author.id)
使用显式转换:if (premium.premium[i] === String(msg.author.id))
解决此类问题的真正有趣且简单的方法是使用内置的数组方法,如 map、reduce 或 filter。那么你就不必担心你的迭代器值了。
例如。
const doSomethingAuthorRelated = (el) => console.log(el, 'whoohoo!');
const authors = premiums
.filter((el) => el === msg.author.id)
.map(doSomethingAuthorRelated);
正如 John Lonowski 在评论 link 中指出的那样,使用 for ... in for JavaScript 数组并不可靠,因为它旨在迭代对象属性,因此您不能真正确定它迭代的是什么,除非你已经清楚地定义了数据并且在你知道没有其他库与 Array 对象混淆的环境中工作。
我有一个包含 2 个不一致客户端 ID 的 JSON 文件`{
{
"premium": [
"a random string of numbers that is a client id",
"a random string of numbers that is a client id"
]
}
我尝试访问这些客户端 ID 以使用 for 循环 + if 语句在程序中执行操作:
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 次 运行,第一次运行时它会立即转到 else,即使发送消息的人的客户端 ID 在 JSON 文件。
我该如何解决这个问题?非常感谢任何帮助。
您可能想在 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()
注意:如果不将以上内容包装在函数中,控制台将显示:"Syntax Error: Illegal return statement."
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
是整数,它将评估为 false 因为您正在与字符串进行比较(基于您提供的json)。
使用隐式转换:if (premium.premium[i] == msg.author.id)
使用显式转换:if (premium.premium[i] === String(msg.author.id))
解决此类问题的真正有趣且简单的方法是使用内置的数组方法,如 map、reduce 或 filter。那么你就不必担心你的迭代器值了。
例如。
const doSomethingAuthorRelated = (el) => console.log(el, 'whoohoo!');
const authors = premiums
.filter((el) => el === msg.author.id)
.map(doSomethingAuthorRelated);
正如 John Lonowski 在评论 link 中指出的那样,使用 for ... in for JavaScript 数组并不可靠,因为它旨在迭代对象属性,因此您不能真正确定它迭代的是什么,除非你已经清楚地定义了数据并且在你知道没有其他库与 Array 对象混淆的环境中工作。