Почему indexOf в javascript не работает?

Я не уверен, что я делаю неправильно здесь. Первый раз, когда я использую 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

мутация должна возвращать false, если элемент из arr[1] отсутствует в arr[0], иначе возвращает true.


person splucena    schedule 22.11.2015    source источник
comment
что именно вы хотите сделать?   -  person Mritunjay    schedule 22.11.2015
comment
Я только что вставил ваш код в консоль JS, и у меня тоже получилось   -  person csga5000    schedule 22.11.2015
comment
Если вы используете IE8 и более ранние версии, .indexOf() не поддерживается. Ссылка: stackoverflow .com/questions/3629183/   -  person    schedule 22.11.2015
comment
я использую хром и firefox.   -  person splucena    schedule 22.11.2015
comment
@splucena посмотрите мой отредактированный ответ. Там описаны проблемы с вашим кодом. У вас была ошибка на 1 и отрицательная проверка indexOf.   -  person David Zorychta    schedule 22.11.2015
comment
@Macmee все еще проверяю   -  person splucena    schedule 22.11.2015


Ответы (4)


ваш код не работает, потому что, когда вы говорите:

res.indexOf("f") != -1

это означает: «Я нашел букву f», но вы трактуете это так, как будто это означает «я не нашел букву f».

В вашем случае вы хотите вернуть false, если найдете «f», но вы возвращаете true. Переверните ваши истинные и ложные случаи:

if (res.indexOf("f") != -1) {
   return false;
 } else {
   return true;
 }

ТАКЖЕ ваш цикл for неверен, потому что x начинается с 0, поэтому вам нужно перейти к длине ‹, а не ‹= длине вашей строки.

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

и теперь ваш код работает так, как вы хотели.

person David Zorychta    schedule 22.11.2015
comment
или еще лучше: return !res.indexOf("f") - person Samuel Cook; 22.11.2015
comment
@Macmee Вы правы, я сформировал свое мышление в первый раз, когда использовал indexOf, и ожидал, что он вернет true, когда я ищу false. - person splucena; 22.11.2015

Только что отредактировал свой код. Нажмите на <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>

person Community    schedule 22.11.2015

Если немного упростить логику, то проще проверить:

function mutation(arr) {
  return arr[1].split('').reduce(function(res, x) {
    return arr[0].indexOf(x) >= 0;
  }, true);
}

Спасибо Леон за исправление.

person Hunan Rostomyan    schedule 22.11.2015
comment
имеет ли использование true && condition какие-либо преимущества? - person Leon Adler; 22.11.2015
comment
@LeonAdler По сравнению с чем? - person Hunan Rostomyan; 22.11.2015
comment
Это работает. Можете ли вы определить, что не так с моим кодом? - person splucena; 22.11.2015
comment
по сравнению только с condition - return arr[0].indexOf(x) >= 0 - person Leon Adler; 22.11.2015
comment
@ЛеонАдлер, ха-ха! Конечно, спасибо чувак. Это было глупо с моей стороны. - person Hunan Rostomyan; 22.11.2015
comment
нет проблем - ожидал, что я пропустил какое-то причудливое улучшение производительности JS, например var x = number | 0 ;-) - person Leon Adler; 22.11.2015
comment
@splucena Macmee уже ответил на этот вопрос, поэтому ознакомьтесь с его объяснением. - person Hunan Rostomyan; 22.11.2015

Я пытался не рисковать вашей логикой, ошибка:

  • Вы пытаетесь сравнить все символы в массиве [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;
}
person Roberto Capelo    schedule 22.11.2015