为什么JavaScript中的indexOf不起作用?

4

我不确定我在这里做错了什么。当我第一次使用indexOf时,它完全正常,但是当我第二次使用它时,它没有返回我期望的结果。

function mutation(arr) {
    //return arr;
    res = "";
    for (var x=0; x<arr[1].split("").length; x++) {
        if (arr[0].indexOf(arr[1].split("")[x]) !== -1) {
            res += "t";
        } else {
            res += "f";
        }
    }
    // res = ttt
    if (res.indexOf("f") !== -1) {
        return true;
    } else {
        return false;
    }
}

mutation(["hello", "hey"]);
// this returns true instead of false
mutation(["floor", "loo"]); 
// returns false instead of true

如果arr[1]中的元素不在arr[0]中,则mutation应返回false,否则返回true。


你想要做什么? - Mritunjay
我刚刚将你的代码粘贴到JS控制台中,结果也是true。 - csga5000
如果您正在使用IE8及更早版本,则不支持.indexOf()。参考链接:https://dev59.com/j3A65IYBdhLWcg3wyh57 - user4090029
我正在使用Chrome和Firefox浏览器。 - splucena
@splucena,看一下我编辑后的答案。你代码的问题已经在那里概述了。你有一个1的偏差错误和一个否定的indexOf检查。 - David Zorychta
@Macmee 嗯,我还在检查。 - splucena
4个回答

3
您的代码无法运行,因为当您写下如下代码块时: res.indexOf("f") != -1 就意味着:“我发现了‘f’”,但是您却像“我没有发现‘f’”一样来对待它。
在您的案例中,当您发现一个‘f’时,想要返回false,但是您实际上返回的是true。请将true和false的情况反过来:
if (res.indexOf("f") != -1) {
   return false;
 } else {
   return true;
 }

同时,你的for循环写法有误,因为x从0开始,所以需要遍历到字符串长度而不是小于等于字符串长度。

for (var x=0; x < arr[1].split("").length; x++) {

这样修改后,你的代码就能按照你期望的方式工作了。


返回已翻译的文本:或者更好的方式:return !res.indexOf("f") - Samuel Cook
@Macmee 你说得对,我在第一次使用indexOf时形成了这种思维模式,期望它在查找false时返回true。 - splucena

2

我已经编辑了您的代码。点击<p>检查:

function mutation(arr) {
  //return arr;
  res = "";
  for (var x=0; x< arr[1].split("").length; x++) {
    res += arr[0].indexOf(arr[1].split("")[x]) > -1 ? 't' : 'f';
  }
 return res.indexOf('f') > -1;
}

$('p').click(function(){
  alert(mutation(["hello", "hey"]));
  alert(mutation(["floor", "loo"]));
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>Click me</p>


0
如果你把逻辑简化一下,那就更容易检查了:
function mutation(arr) {
  return arr[1].split('').reduce(function(res, x) {
    return arr[0].indexOf(x) >= 0;
  }, true);
}

感谢Leon的纠正。


使用 true && condition 有什么好处吗? - Leon Adler
@LeonAdler 相对于什么来说? - Hunan Rostomyan
这个代码是可以运行的。你能发现其中的问题吗? - splucena
与仅使用 condition 相比 - return arr[0].indexOf(x) >= 0 - Leon Adler
@LeonAdler 哈哈!当然,谢谢你。我真是太蠢了。 - Hunan Rostomyan
显示剩余2条评论

0

我试图不改变你的逻辑,错误在于:

  • 你正在尝试与数组[0]上的所有字符进行比较,而不仅仅是第一个。
  • 如果你发现一个字符等于数组[0]的第一个字符,你应该返回 true。

正确代码:

function mutation(arr) {
  res = "";
  for (var x=0; x<=arr[1].split("").length; x++) {
    if (arr[0].split("")[0].indexOf(arr[1].split("")[x]) !== -1) {
      return true;
    }
  }
  return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接