如果 属性 未定义则跳至 else
Skip to else if property is undefined
我有创建团队并将数据放入数据库的功能。现在我正在尝试检查团队是否已经存在,如果存在则回复消息。我的 if 语句有问题。
if (result[0].teamname == teamName)
当 result[0].teamname 未定义时,它显示 Cannot read 属性 'teamname' of undefined 它忽略其他并抛出错误。我怎样才能做到不忽略其他?
这是我用来创建团队的功能。
function createTeam(teamName, members, message) {
teamName = teamName.replace("_", " ");
let insertTeam = `INSERT INTO teams (teamname) VALUES ('${teamName}');`;
db.select(`SELECT id_t, teamname FROM teams WHERE teamname = '${teamName}'`, function(err, result) {
if (err) {
throw err;
} else {
if (result[0].teamname == teamName) {
if (message.guild !== null) message.delete();
message.reply("this team already exists!");
} else {
db.query(insertTeam);
db.select(`SELECT id_t FROM teams WHERE teamname = '${teamName}'`, function(err, result) {
if (err) {
throw err;
} else {
for (let i = 0; i < members.length; i++) db.query(`INSERT INTO team_user (user, team) VALUES ('${members[i]}' , ${result[0].id_t})`);
}
});
if (message.guild !== null) message.delete();
let newTeam = new Discord.RichEmbed()
.setThumbnail("https://cdn.discordapp.com/emojis/542789472421675028.png?v=1")
.setColor("#15f153")
.addField("New team has been created!", `Team ${teamName} has been created with total of ${members.length} members!\nGood luck!`);
message.channel.send(newTeam);
}
}
});
到目前为止我尝试了什么:
- 正在检查 result[0].teamname 是否未定义
- 检查结果长度是否不为 0
- try-catch 语句
if (result[0] && result[0].teamname == teamName)
首先你需要检查结果[0]是否未定义
如果结果是多于一个值的数组,那么你需要遍历每一个,你可以使用过滤数组的方法:
var found = result.filter((row) => row.teamname == teamName);
if (found.length) {
}
您也可以像@ThomasKleßen 那样在评论中提及检查结果是否未定义:
var found = result && result.filter((row) => row.teamname == teamName).length;
if (found) {
}
您需要short-circuit条件。这意味着您要先检查 result
是否存在,然后再检查 result
的属性
例如,您的代码应如下所示:
if (result && result[0] && result[0].teamname == teamName) {
//Do something
}
你总是可以做一个默认值
if ((result || [{}])[0].teamname == teamName)
如果结果为假,它将默认为一个空对象数组,这将允许数组访问和点符号工作,但相等性失败。
我有创建团队并将数据放入数据库的功能。现在我正在尝试检查团队是否已经存在,如果存在则回复消息。我的 if 语句有问题。
if (result[0].teamname == teamName)
当 result[0].teamname 未定义时,它显示 Cannot read 属性 'teamname' of undefined 它忽略其他并抛出错误。我怎样才能做到不忽略其他?
这是我用来创建团队的功能。
function createTeam(teamName, members, message) {
teamName = teamName.replace("_", " ");
let insertTeam = `INSERT INTO teams (teamname) VALUES ('${teamName}');`;
db.select(`SELECT id_t, teamname FROM teams WHERE teamname = '${teamName}'`, function(err, result) {
if (err) {
throw err;
} else {
if (result[0].teamname == teamName) {
if (message.guild !== null) message.delete();
message.reply("this team already exists!");
} else {
db.query(insertTeam);
db.select(`SELECT id_t FROM teams WHERE teamname = '${teamName}'`, function(err, result) {
if (err) {
throw err;
} else {
for (let i = 0; i < members.length; i++) db.query(`INSERT INTO team_user (user, team) VALUES ('${members[i]}' , ${result[0].id_t})`);
}
});
if (message.guild !== null) message.delete();
let newTeam = new Discord.RichEmbed()
.setThumbnail("https://cdn.discordapp.com/emojis/542789472421675028.png?v=1")
.setColor("#15f153")
.addField("New team has been created!", `Team ${teamName} has been created with total of ${members.length} members!\nGood luck!`);
message.channel.send(newTeam);
}
}
});
到目前为止我尝试了什么:
- 正在检查 result[0].teamname 是否未定义
- 检查结果长度是否不为 0
- try-catch 语句
if (result[0] && result[0].teamname == teamName)
首先你需要检查结果[0]是否未定义
如果结果是多于一个值的数组,那么你需要遍历每一个,你可以使用过滤数组的方法:
var found = result.filter((row) => row.teamname == teamName);
if (found.length) {
}
您也可以像@ThomasKleßen 那样在评论中提及检查结果是否未定义:
var found = result && result.filter((row) => row.teamname == teamName).length;
if (found) {
}
您需要short-circuit条件。这意味着您要先检查 result
是否存在,然后再检查 result
例如,您的代码应如下所示:
if (result && result[0] && result[0].teamname == teamName) {
//Do something
}
你总是可以做一个默认值
if ((result || [{}])[0].teamname == teamName)
如果结果为假,它将默认为一个空对象数组,这将允许数组访问和点符号工作,但相等性失败。