我试着解决下面的问题:
我的索引:定义一个接受三个参数的函数myIndexOf:
如果源包含searchValue,则返回searchValue启动的索引。
如果searchValue在源中出现多次,则从searchValue的第一次出现返回索引。如果源中不存在searchValue,则返回-1。
如果将startIdx传递给函数,则忽略在该索引之前发生的searchValue的任何实例。如果未提供startIdx,则从源的开头开始搜索。
不要在答案中使用内置的.indexOf字符串方法。
我尝试了以下代码:
function myIndexOf(source, searchValue, startIdx=0){
for (i=startIdx; i<=source.length - searchValue.length; i++){
//console.log(source[i])
let subString = source.slice(i, i+searchValue.length);
if(subString === searchValue){
return i
}
else {
return -1
}
}
}
myIndexOf('twice twice', 'ice', 5);
该函数应返回8,但它返回-1。我知道else语句可能是导致错误的原因,但我不明白为什么else语句不能在哪里。
问题是for循环在第一次迭代后结束。在那里有一个else块,整个函数过早地结束它的执行(因此for循环),因为无论条件是否满足,它都返回一个值。
试试这个:
function myIndexOf(source, searchValue, startIdx=0){
for (i=startIdx; i<=source.length - searchValue.length; i++) {
let subString = source.slice(i, i+searchValue.length);
if(subString === searchValue){
return i;
}
}
return -1;
}
在上面的函数中,for循环只有在找到搜索到的值时才会停止。如果从未找到,则该函数默认返回-1。