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

string.indexOf() sous le capot

DDD
Libérer: 2025-01-17 08:27:08
original
117 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal