Maison >interface Web >js tutoriel >string.indexOf() sous le capot
Bonjour les développeurs !
Aujourd'hui, j'ai essayé d'implémenter la méthode indexOf()
à partir de zéro. Jusqu'à présent, j'ai trouvé ce qui suit :
<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>
Explication du code :
La méthodeindexOf()
accepte trois paramètres :
string
: La chaîne à rechercher. target
: La sous-chaîne à rechercher. start
: L'index à partir duquel la recherche commencera (0 par défaut). Ma première tentative :
Mon idée initiale était simple : parcourir la chaîne et quand je trouve string[i] === target
, revenir i
. Si aucune correspondance n'est trouvée à la fin de la boucle, -1 est renvoyé. Le code est le suivant :
<code class="language-javascript">// 此方法仅适用于单个字符的目标</code>
Cependant, cette méthode ne fonctionne que lorsque target
est un seul caractère, puisque nous comparons caractère par caractère.
Ma deuxième tentative :
Ensuite, j'ai réalisé que je devais comparer les sous-chaînes si target
est plus long qu'un caractère. J'utilise la méthode substr()
pour comparer des sous-chaînes de même longueur que target
. La boucle est ajustée pour s'arrêter lorsqu'il reste suffisamment de caractères dans la chaîne pour comparer :
<code class="language-javascript">// 此方法处理多字符目标,但未处理start参数</code>
Ma troisième tentative :
Ensuite, je dois gérer le paramètre start
, qui peut être négatif. La méthode indexOf()
intégrée commence la recherche à partir de start
lorsque string.length start
est négatif. Par exemple, si la longueur de la chaîne est 10 et start
est -4, la recherche commencera à l'index 6 (c'est-à-dire 10 - 4).
Pour résoudre ce problème, j'ai mis à jour le code pour gérer les valeurs start
négatives :
<code class="language-javascript">function myIndexOf(string, target, start = 0) { let l = target.length; if (start < 0) { start = string.length + start; } // ... (其余代码与第二次尝试相同) }</code>
Version finale :
Par curiosité, je voulais gérer des valeurs start
plus grandes que la longueur de la chaîne, j'ai décidé de modifier la fonction pour que si le start
dépasse la longueur de la chaîne, il continue à "enrouler" le chaîne. De cette façon, la fonction continuera la recherche à partir de l'index approprié après le bouclage. La solution finale utilise cette formule pour ajuster l'indice de départ :
<code class="language-javascript">start = (string.length + start) % string.length;</code>
Comment ça marche :
start % string.length
garantit que start
est compris entre -string.length
et string.length
. string.length
pour garantir que tout résultat négatif devienne positif. start
est enroulée et tombe dans les limites d'index valides. Ensuite, je souhaite utiliser la recherche binaire au lieu de la recherche linéaire, qu'en pensez-vous ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!