我对此代码存在此问题。这段代码应该返回“室内装饰学习”,但它不断回归“家居装饰学习”,我做错了什么?
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);
谢谢,
答案 0 :(得分:2)
forbidden.indexOf(items[i][0])
会返回匹配位置或-1
。这意味着当没有匹配或者在字符串的开头之外的任何地方存在匹配时它是真实的。它返回假值的唯一时间是它与字符串的开头匹配并返回0
,就像你的场景中"home"
的情况一样。
要使用indexOf
作为测试来查看字符串是否包含值,您需要进行测试以检查它是否返回-1
或任何其他数字(EG。您可以使用{{1}等条件}或!== -1
)。在现代JavaScript引擎中或使用非常简单的SHIM,您可以使用String.prototype.includes代替返回布尔值,更好地表示您的意图。
在您的情况下,您根本不需要>= 0
声明。如果无法找到替换模式,只需进行替换并依赖replace是无操作的事实:
if
注意:String.prototype.replace仅在与字符串或非全局正则表达式一起用作替换模式时替换 第一个 匹配。这意味着您的代码将允许禁止的单词,只要发生至少两次。解决方法超出了这个答案的范围。