Maison >interface Web >js tutoriel >string.indexOf() sous le capot

string.indexOf() sous le capot

DDD
DDDoriginal
2025-01-17 08:27:08120parcourir

string.indexOf() under the hood

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éthode

indexOf() accepte trois paramètres :

  1. string : La chaîne à rechercher.
  2. target : La sous-chaîne à rechercher.
  3. 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 :

    L'
  • opérateur modulostart % string.length garantit que start est compris entre -string.length et string.length.
  • Ajout de string.length pour garantir que tout résultat négatif devienne positif.
  • L'opération modulo finale de
  • garantit que la valeur de 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn