Rumah >hujung hadapan web >tutorial js >string.indexOf() di bawah tudung

string.indexOf() di bawah tudung

DDD
DDDasal
2025-01-17 08:27:08120semak imbas

string.indexOf() under the hood

Helo, pembangun!

Hari ini, saya cuba melaksanakan kaedah indexOf() dari awal. Setakat ini saya telah menemui perkara berikut:

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

Penjelasan kod:

Kaedah

indexOf() menerima tiga parameter:

  1. string: Rentetan untuk dicari.
  2. target: Subrentetan untuk dicari.
  3. start: Indeks di mana carian akan bermula (lalai 0).

Percubaan pertama saya:

Idea awal saya adalah mudah: gelung melalui rentetan dan apabila saya menemui string[i] === target, kembalikan i. Jika tiada padanan ditemui pada penghujung gelung, -1 dikembalikan. Kodnya adalah seperti berikut:

<code class="language-javascript">// 此方法仅适用于单个字符的目标</code>

Walau bagaimanapun, kaedah ini hanya berfungsi apabila target ialah satu watak, memandangkan kami sedang membandingkan watak demi watak.

Percubaan kedua saya:

Kemudian saya menyedari bahawa saya perlu membandingkan subrentetan jika target lebih panjang daripada satu aksara. Saya menggunakan kaedah substr() untuk membandingkan subrentetan yang sama panjang dengan target. Gelung dilaraskan untuk berhenti apabila terdapat cukup aksara yang tinggal dalam rentetan untuk dibandingkan:

<code class="language-javascript">// 此方法处理多字符目标,但未处理start参数</code>

Percubaan ketiga saya:

Seterusnya, saya perlu mengendalikan parameter start, yang boleh menjadi negatif. Kaedah indexOf() terbina dalam mula mencari dari start apabila string.length start adalah negatif. Contohnya, jika panjang rentetan ialah 10 dan start ialah -4, carian akan bermula pada indeks 6 (iaitu 10 - 4).

Untuk membetulkannya, saya mengemas kini kod untuk mengendalikan nilai start negatif:

<code class="language-javascript">function myIndexOf(string, target, start = 0) {
    let l = target.length;

    if (start < 0) {
        start = string.length + start;
    }

    // ... (其余代码与第二次尝试相同)
}</code>

Versi akhir:

Oleh kerana ingin tahu saya ingin mengendalikan start nilai yang lebih besar daripada panjang rentetan, saya memutuskan untuk mengubah suai fungsi supaya jika start melebihi panjang rentetan, ia terus "membungkus" rentetan. Dengan cara ini fungsi akan terus mencari dari indeks yang sesuai selepas dibungkus. Penyelesaian akhir menggunakan formula ini untuk melaraskan indeks permulaan:

<code class="language-javascript">start = (string.length + start) % string.length;</code>

Cara ia berfungsi:

  • pengendali modulostart % string.length memastikan bahawa start berada dalam julat -string.length hingga string.length.
  • Ditambah string.length untuk memastikan sebarang keputusan negatif menjadi positif.
  • Operasi modulo terakhir
  • memastikan bahawa nilai start dililitkan dan berada dalam sempadan indeks yang sah.

Seterusnya saya ingin menggunakan carian binari dan bukannya carian linear, apa pendapat anda?

Atas ialah kandungan terperinci string.indexOf() di bawah tudung. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn