javascript - IndexOf 和多数组

标签 javascript indexof

我在使用这段代码时遇到了这个问题。这段代码应该返回“室内装饰学习”,但它一直返回“家居装饰学习”,我做错了什么?

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/

相关文章:

javascript - 如何获取蓝色文本选择的大小?

javascript - Durandal 插件未加载

java - 如何在父自定义对象数组列表中获取自定义对象子列表中的单个项目位置?

php - 是否可以使用 .htaccess 制作自定义页面索引?如果是这样怎么办?

java - 字符串参数索引

javascript - 如何在 JavaScript 中执行同步 HTTP 请求

javascript - 如何从自定义按钮调用数据表 csv 按钮

javascript - 我可以使用元素的数据属性的值来声明变量吗?

javascript - 使用 Javascript 从另一个数组的每个元素中的尾随数字创建一个数组

java - Java中如何从字符串中分别提取字符串和整数?