Почему вычисляемый вручную индекс символа в строке возвращает -1?

#javascript #return-value #indexof

#javascript #возвращаемое значение #indexof

Вопрос:

Требование: Функция должна возвращать первый индекс в слове, в котором существует символ, или -1, если символ не найден. Не используйте функцию String.indexOf() .

Пример: stringIndexOf('awesome', 'e') // returns 2

Проблема в том, что мой код продолжает возвращать -1:

 function stringIndexOf(word, char) {
  let index = 1
  for (var i = 0; i < word.length; i  ) {
    if (word[i] === char) {
      index = i
    }
  }
  return -1
}
console.log(stringIndexOf('awesome', 'e'));
  

Комментарии:

1. Привет, возможно return index , сразу после того, как совпадение найдено.

2. вы возвращаете -1 с помощью return -1 return index

3. ( (word, char) => word.search(char))(‘awesome’, ‘e’);

Ответ №1:

Ваш код продолжает возвращать -1, потому что в конце stringIndexOf вы возвращаете -1.

 function stringIndexOf(word, char) {
  let index = 1
  for (var i = 0; i < word.length; i  ) {
    if (word[i] === char) {
      index = i
    }
  }
  return -1 // <---------- :(
}
console.log(stringIndexOf('awesome', 'e'));
  

Должно быть:

 function stringIndexOf(word, char) {
  // This can start at -1 so you can return
  // -1 in the case that word[i] never equaled char,
  // meaning the char does not exist in the word.
  let index = -1

  for (var i = 0; i < word.length; i  ) {
    if (word[i] === char) {
      index = i
    }
  }
  return index
}
console.log(stringIndexOf('awesome', 'e'));
  

Комментарии:

1. Как насчет break выхода из for цикла, чтобы не всегда проходить полный цикл ?

2. Это было бы более эффективно. Я пытался внести только необходимые изменения, чтобы соответствовать их требованиям.

Ответ №2:

Вам нужно либо использовать второе предложение «return», либо сохранить возвращаемое значение перед последней строкой функции.

Вариант 1:

 function stringIndexOf(word, char) {
  for (var i = 0; i < word.length; i  ) {
    if (word[i] === char) {
      return i
    }
  }
  return -1
}
  

Вариант 2:

 function stringIndexOf(word, char) {
  let index;
  for (var i = 0; i < word.length; i  ) {
    if (word[i] === char) {
      index = i
    }
  }
  if (index == undefined) {
    index = -1;
  }
  return index;
}
  

Вы можете избежать этого последнего оператора if и просто присвоить переменной «index» значение «-1» в первой строке.

Небольшой дополнительный совет: хотя word[i] работает, лучше использовать word.charAt(i) — это правильный метод для строк, [ ] лучше для массивов.

Комментарии:

1. Никто не хочет выходить for из цикла return и не хочет всегда полностью повторять for цикл. Как насчет использования while цикла на основе или break оператора внутри for цикла?

2. Разве «break» не так же плох, как «return» внутри цикла? Цикл while был бы лучше, но я не хотел сильно портить их код на случай, если это затруднит понимание. 🙂

3. A break является полностью действительным (есть даже a continue ). Но чтобы никому не навредить , я предложил и то , и другое … «Как насчет использования цикла на основе while или разрыва …» … потому что я лично предпочитаю while

Ответ №3:

Помимо очевидной ошибки, заключающейся в том, что функция всегда возвращает возврат -1 , который может быть исправлен, как уже предлагали другие, существует подход, свободный от indexOf , который, кроме того, не использует ни for оператор, ни while оператор, но split вместо этого использует …

 function stringIndexOf(str, search) {
  let index = -1;

  search = String(search);
  const result = String(str).split(search, 2);

//if ((result.length === 2) amp;amp; (search.length === 1)) {
  if ((result.length === 2) amp;amp; (search.length >= 1)) {

    index = result[0].length;
  }
  return index;
}

console.log(
  "stringIndexOf('awesome', 'e')",
  stringIndexOf('awesome', 'e')
);
console.log(
  "stringIndexOf('awesome', 'we')",
  stringIndexOf('awesome', 'we')
);
console.log(
  "stringIndexOf('awesome', 'awe')",
  stringIndexOf('awesome', 'awe')
);
console.log(
  "stringIndexOf('awesome', 'some')",
  stringIndexOf('awesome', 'some')
);
console.log(
  "stringIndexOf('awesome', 'awesomeness')",
  stringIndexOf('awesome', 'awesomeness')
);
console.log(
  "stringIndexOf('awesome', '4')",
  stringIndexOf('awesome', '4')
);
console.log(
  "stringIndexOf('awesome', '')",
  stringIndexOf('awesome', '')
);  
 .as-console-wrapper { min-height: 100%!important; top: 0; }