#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
является полностью действительным (есть даже acontinue
). Но чтобы никому не навредить , я предложил и то , и другое … «Как насчет использования цикла на основе 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; }