我在使用这段代码时遇到了这个问题。这段代码应该返回“室内装饰学习”,但它一直返回“家居装饰学习”,我做错了什么?
var forbidden = "home decor learn";
var items = [
["decor", "decoration"],
["learn", "learning"],
["home", "interior"],
];
for(i = 0; i<items.length; i++){
if(forbidden.indexOf(items[i][0])){
forbidden = forbidden.replace(items[i][0], items[i][1]);
}
}
document.write(forbidden);
谢谢,
最佳答案
forbidden.indexOf(items[i][0])
返回匹配的位置,如果没有匹配则返回 -1
。这意味着当没有匹配项或除了字符串开头以外的任何地方都存在匹配项时,它是真实的。它返回虚假值的唯一一次是当它与字符串的最开始匹配并返回 0
时,就像您场景中的 "home"
的情况一样。 p>
要使用 indexOf
作为测试来查看字符串是否包含值,您需要测试来检查它是否返回 -1
或任何其他数字(例如,您可以使用 !== -1
或 >= 0
等条件。在现代 JavaScript 引擎中或使用非常简单的 SHIM,您可以使用 String.prototype.includes相反,它返回一个 bool 值并且更好地表示您的意图。
就您而言,您根本不需要 if
语句。只需进行替换并依赖 replace 的事实如果找不到替换模式,则为空操作:
var forbidden = "home decor learn";
var items = [
["decor", "decoration"],
["learn", "learning"],
["home", "interior"],
];
for(i = 0; i<items.length; i++){
forbidden = forbidden.replace(items[i][0], items[i][1]);
}
document.write(forbidden);
注:String.prototype.replace当与字符串或非全局正则表达式一起用作替换模式时,仅替换第一个匹配项。这意味着您的代码将允许禁用单词,只要该单词至少出现两次即可。解决方法超出了本答案的范围。
关于javascript - IndexOf 和多数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702462/