開発者の皆さん、こんにちは!
今日は、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()
メソッドは 3 つのパラメータを受け入れます:
string
: 検索する文字列。 target
: 検索する部分文字列。 start
: 検索を開始するインデックス (デフォルトは 0)。 私の最初の試み:
私の最初のアイデアは単純で、文字列をループし、string[i] === target
が見つかったら i
を返すというものでした。ループの最後に一致するものが見つからない場合は、-1 が返されます。コードは次のとおりです:
<code class="language-javascript">// 此方法仅适用于单个字符的目标</code>
ただし、文字ごとに比較するため、この方法は target
が 1 文字の場合にのみ機能します。
2 回目の試み:
その後、target
が 1 文字より長い場合は部分文字列を比較する必要があることに気付きました。 substr()
メソッドを使用して、target
と同じ長さの部分文字列を比較します。ループは、文字列内に比較するのに十分な文字が残ったときに停止するように調整されています:
<code class="language-javascript">// 此方法处理多字符目标,但未处理start参数</code>
3 回目の試み:
次に、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 中国語 Web サイトの他の関連記事を参照してください。