首页 > 解决方案 > message.content.startWith 的替代方案

问题描述

我正在使用不和谐的机器人,并且正在使用页面执行帮助命令。

我有这个设置:

if(message.content.startWith(`${prefix}help`))

if(message.content.startWith(`${prefix}help 2`))

如果我这样做,>help 2我会得到两个。有没有办法阻止这种情况发生?

标签: javascriptbotsdiscorddiscord.js

解决方案


使用startsWith(">help")(not startWith) 时,它将匹配 ">help 2",因为该字符串确实以 ">help" 开头。如果您想更精确地匹配这些案例,您应该将最具体的案例放在首位并else if用于后续比较。

if (message.content.startsWith(`${prefix}help 2`)) { /* do 2 */ }
else if (message.content.startsWith(`${prefix}help 3`)) { /* do 3 */ }
else if (message.content.startsWith(`${prefix}help 4`)) { /* do 4 */ }
else if (message.content.startsWith(`${prefix}help`)) { /* do other */ }
else if (message.content.startsWith(`${prefix}faq`)) { /* do faq */ }

如果第一种情况不匹配,上面的代码只会匹配第二种情况。

进一步说明:比较部分字符串时,您需要小心匹配正确的内容。看这个例子:

let names = [ "Roberta", "Robert" ]
// case #1 - fails (wrong order)
names.forEach(name => {
  let salutation;
  if (name.startsWith("Robert")) 
    salutation = "Mr.";
  else if (name.startsWith("Roberta")) 
    salutation = "Miss";
  console.log("1) "+salutation+" "+name);
})

// case #2 - fails (missing else)
names.forEach(name => {
  let salutation;
  if (name.startsWith("Roberta")) 
    salutation = "Miss";
  if (name.startsWith("Robert")) 
    salutation = "Mr.";
  console.log("2) "+salutation+" "+name);
})

// case #3 - works
names.forEach(name => {
  let salutation;
  if (name.startsWith("Roberta")) 
    salutation = "Miss";
  else if (name.startsWith("Robert")) 
    salutation = "Mr.";
  console.log("3) "+salutation+" "+name);
})

案例 #1 失败,因为两个名称在第一个 if 语句上匹配,因为这两个名称实际上都以“罗伯特”开头。但我们不希望它与“Roberta”匹配,因为我们对字符串的开头进行了第二次检查。然而,代码从未进入第二个 if 语句,因为它已经与第一个匹配。通过颠倒检查的顺序并首先检查“Roberta”,我们得到了正确的行为,因为它更具体('Robert' 不以'Roberta' 开头,但'Roberta' 确实以'Robert' 开头)。所以重要的部分是让你的 if 语句在更一般的值之前与最具体的匹配。

案例 #2 失败,因为即使第一个 if 语句匹配,第二个也可以匹配。我们想用它else if来确保如果代码中前面的某些内容已经匹配,我们不会继续检查其他情况。


推荐阅读