Rumah >hujung hadapan web >tutorial js >string.indexOf() di bawah tudung
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:
KaedahindexOf()
menerima tiga parameter:
string
: Rentetan untuk dicari. target
: Subrentetan untuk dicari. 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:
start % string.length
memastikan bahawa start
berada dalam julat -string.length
hingga string.length
. string.length
untuk memastikan sebarang keputusan negatif menjadi positif. 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!