【问题标题】:How to Test if a String Has an Array Entry [duplicate]如何测试字符串是否具有数组条目
【发布时间】:2018-08-11 03:46:08
【问题描述】:

我正在使用 Discord.js 创建一个 Discord 机器人,只要有人在消息中发誓,它就会捕获。我有一个数组,里面有很多常用的脏话、缩写词、种族和性诽谤等等,我希望它能够捕捉到。

const SwearWords = ["a##","ba##ard","bi###","c#ck","c#nt","d#ck","f#ck","gay","k#ke","n#gg","omfg","sh#t","wtf"];

(数组没有所有标签,我只是将它们添加到帖子中)

我最初尝试使用的是if (lcMsg.includes(SwearWords)) {return;},而lcMsgmessage.content.toLowerCase();,这样无论用户如何使用它,它都能捕捉到用户的脏话。但这没有用,所以我在谷歌搜索答案后尝试使用.entries().every()(但我从未找到任何答案)。

我想.map() 会起作用吗?我不知道,因为我还没有学会如何使用它。如果有人能帮我解决这个问题,那就太好了。

【问题讨论】:

  • 这个怎么样? lcMsg.split(" ").forEach(msg=> swearWords.includes(msg))
  • let containsSwears = lcMsg.split(" ").some(s => SwearWords.indexOf(s.toLowerCase()) > -1);
  • 您接受答案的速度太快了。请至少等待 24 或 48 小时才能接受答案,因为这会阻止其他人尝试发布更好的答案。

标签: javascript arrays node.js discord.js


【解决方案1】:

数组.some 方法在这里会很有帮助。将其与您的 .includes 结合起来,查看消息中是否存在这些词:

const SwearWords = ["a##","ba##ard","bi###","c#ck","c#nt","d#ck","f#ck","gay","k#ke","n#gg","omfg","sh#t","wtf"];

const saltyMessage = "wtf, git gud scrub";
const niceMessage = "gg wp";

function hasBadWord(msg) {
    return SwearWords.some(word => msg.includes(word));
}

console.log("Message and has swear word?:", saltyMessage, " -> ", hasBadWord(saltyMessage));
console.log("Message and has swear word?:", niceMessage, " -> ", hasBadWord(niceMessage));

此外,您可以使用.find 而不是.some 来查找消息中包含的单词:

const SwearWords = ["a##","ba##ard","bi###","c#ck","c#nt","d#ck","f#ck","gay","k#ke","n#gg","omfg","sh#t","wtf"];

const saltyMessage = "wtf, git gud scrub";
const niceMessage = "gg wp";

function whichBadWord(msg) {
    return SwearWords.find(word => msg.includes(word));
}

console.log("Message and has swear word?:", saltyMessage, " -> ", whichBadWord(saltyMessage));
console.log("Message and has swear word?:", niceMessage, " -> ", whichBadWord(niceMessage));

【讨论】:

  • 这个很好用,谢谢!!
  • 很高兴能提供帮助,但我突然想到,如果一个单词包含一个脏话作为子字符串,这将返回 true,例如:"Assistant manager" 会给出误报。所以要小心使用。您可能需要考虑为此使用正则表达式测试。
  • 好的。我从未使用过正则表达式测试;哪里有好学的地方?
  • 网上有很多教程。我对任何一个都没有特别的偏好。我会说随便挑一个就可以了。学习正则表达式起初有点令人生畏,但一旦你了解它们,它们就会非常有帮助。 this site 有一个很好的互动教程,但还有很多其他的。
  • 好的,谢谢!
【解决方案2】:

你需要使用函数some和函数includes

lcMsg.replace(/\s+/g, ' ').split(' ').some((w) => SwearWords.includes(w));

看看变量lcMsg 是如何准备循环其单词的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 2019-07-15
    • 2017-11-21
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2015-11-12
    相关资源
    最近更新 更多