大家好,开发者们!
今天,我尝试从零开始实现indexOf()
方法。到目前为止,我发现以下内容:
<code class="language-javascript">function myIndexOf(string, target, start = 0) { let l = target.length; // 调整起始索引,如果它是负数 if (start < 0) { start = string.length + start; } // 确保起始索引在字符串长度范围内 if (start < 0) { start = 0; } else if (start >= string.length) { return -1; // 目标索引超出字符串范围 } // 循环遍历字符串 for (let i = start; i <= string.length - l; i++) { if (string.substring(i, i + l) === target) { return i; // 找到目标子串 } } return -1; // 未找到目标子串 }</code>
代码解释:
indexOf()
方法接受三个参数:
string
:要搜索的字符串。target
:要查找的子字符串。start
:搜索将开始的索引(默认为0)。我的第一次尝试:
我最初的想法很简单:循环遍历字符串,当我找到string[i] === target
时,返回i
。如果循环结束时没有找到匹配项,则返回-1。代码如下:
<code class="language-javascript">// 此方法仅适用于单个字符的目标</code>
然而,这种方法只在target
是单个字符时有效,因为我们是逐个字符进行比较。
我的第二次尝试:
然后我意识到,如果target
的长度超过一个字符,我需要比较子字符串。我使用substr()
方法来比较与target
长度相同的子字符串。循环调整为当字符串中剩余的字符足够进行比较时停止:
<code class="language-javascript">// 此方法处理多字符目标,但未处理start参数</code>
我的第三次尝试:
接下来,我需要处理start
参数,它可以是负数。内置的indexOf()
方法在start
为负数时从string.length start
开始搜索。例如,如果字符串长度为10,start
为-4,则搜索将从索引6(即10 - 4)开始。
为了解决这个问题,我更新了代码以处理负的start
值:
<code class="language-javascript">function myIndexOf(string, target, start = 0) { let l = target.length; if (start < 0) { start = string.length + start; } // ... (其余代码与第二次尝试相同) }</code>
最终版本:
出于好奇,我想处理大于字符串长度的start
值,我决定修改函数,以便如果start
超过字符串长度,则继续“环绕”字符串。这样,函数将在环绕后从适当的索引继续搜索。最终的解决方案使用此公式来调整起始索引:
<code class="language-javascript">start = (string.length + start) % string.length;</code>
工作原理:
start % string.length
确保start
在-string.length
到string.length
的范围内。string.length
确保任何负结果都变成正数。start
的值被环绕并落在有效的索引边界内。接下来我想使用二分查找而不是线性查找,您觉得怎么样?
以上是string.indexOf() 底层的详细内容。更多信息请关注PHP中文网其他相关文章!