Bagaimana saya menulis yang setara dengan C # String.StartsWith
di JavaScript?
var haystack = 'hello world';
var needle = 'he';
haystack.startsWith(needle) == true
Catatan: Ini adalah pertanyaan lama, dan sebagaimana ditunjukkan dalam komentar ECMAScript 2015 (ES6) memperkenalkan .startsWith
metode ini. Namun, pada saat penulisan pembaruan ini (2015) dukungan browser masih jauh dari selesai .
sumber
Alternatif lain dengan
.lastIndexOf
:Hal ini terlihat mundur melalui
haystack
untuk terjadinyaneedle
mulai dari indeks0
darihaystack
. Dengan kata lain, itu hanya memeriksa jikahaystack
dimulai denganneedle
.Pada prinsipnya, ini harus memiliki keunggulan kinerja dibandingkan beberapa pendekatan lain:
haystack
.sumber
"aba".lastIndexOf ("a")
adalah 2 seperti yang Anda tunjukkan, tetapi"aba".lastIndexOf ("a", 0)
0, yang benarsumber
.lastIndexOf(input, 0)
bandingkan karakter N pertama, sedangkan.substring(0, input.length) === input
jumlah N, substring data ke panjang N, dan kemudian bandingkan karakter N tersebut. Kecuali ada optimasi kode, versi kedua ini tidak bisa lebih cepat dari yang lain. Tapi jangan salah paham, saya tidak akan pernah menemukan sendiri sesuatu yang lebih baik dari yang Anda sarankan. :)lastIndexOf
dimulai pada indeks 0, bukan akhir. Itu membuat saya tersandung juga, pada awalnya. Namun, memeriksa apa yang dimulai dengan string adalah tugas umum sehingga JavaScript benar-benar harus memiliki API yang tepat untuk itu, tidak semua idiom dan alternatif yang Anda lihat di halaman ini, betapapun pintar mereka.Tanpa fungsi pembantu, hanya menggunakan
.test
metode regex :Untuk melakukan ini dengan string dinamis daripada yang dikodekan (dengan asumsi bahwa string tidak akan mengandung karakter kontrol regexp):
Anda harus memeriksa Apakah ada fungsi RegExp.escape di Javascript? jika ada kemungkinan karakter kontrol regexp muncul di string.
sumber
/^he/i
Solusi terbaik:
Dan ini adalah akhir Dengan jika Anda membutuhkannya juga:
Bagi mereka yang lebih suka prototipe ke dalam String:
Pemakaian:
Dengan metode:
sumber
Saya hanya ingin menambahkan pendapat saya tentang ini.
Saya pikir kita bisa menggunakan seperti ini:
sumber
indexOf
akan berhenti mencari seluruh string ketika menemukan kemunculan pertama. Saya sudah memeriksanya.Berikut ini adalah sedikit peningkatan pada solusi CMS:
Memeriksa apakah fungsi sudah ada jika browser masa depan mengimplementasikannya dalam kode asli atau jika itu diterapkan oleh perpustakaan lain. Misalnya, Perpustakaan Prototipe sudah mengimplementasikan fungsi ini.
Penggunaannya
!
sedikit lebih cepat dan lebih ringkas daripada=== 0
meski tidak bisa dibaca.sumber
String.prototype
adalah ide yang buruk karena tidak mendekati spesifikasi untukString.prototype.startsWith
. Kode apa pun yang mencoba menggunakan metode ES6 cenderung gagal jika Anda melakukan ini; mungkin terlihat untuk melihat apakah metode sudah didefinisikan, melihat bahwa itu (buruk, oleh Anda) dan tidak menambahkan shim yang sesuai dengan spesifikasi, yang mengarah ke perilaku yang salah nanti.Lihat juga underscore.string.js . Muncul dengan sekelompok metode pengujian dan manipulasi string yang berguna, termasuk
startsWith
metode. Dari dokumen:sumber
_.string.startsWith
Baru-baru ini saya bertanya pada diri sendiri pertanyaan yang sama.
Ada beberapa solusi yang mungkin, berikut 3 yang valid:
s.indexOf(starter) === 0
s.substr(0,starter.length) === starter
s.lastIndexOf(starter, 0) === 0
(ditambahkan setelah melihat jawaban Mark Byers )menggunakan loop:
Saya belum menemukan solusi terakhir yang menggunakan loop.
Anehnya solusi ini mengungguli 3 yang pertama dengan selisih yang signifikan.
Berikut adalah tes jsperf yang saya lakukan untuk mencapai kesimpulan ini: http://jsperf.com/startswith2/2
Perdamaian
ps: ecmascript 6 (harmoni) memperkenalkan
startsWith
metode asli untuk string.Bayangkan berapa banyak waktu yang akan dihemat jika mereka berpikir untuk memasukkan metode yang sangat dibutuhkan ini dalam versi awal itu sendiri.
Memperbarui
Seperti yang ditunjukkan Steve (komentar pertama pada jawaban ini), fungsi khusus di atas akan menimbulkan kesalahan jika awalan yang diberikan lebih pendek dari seluruh string. Dia telah memperbaikinya dan menambahkan optimasi loop yang dapat dilihat di http://jsperf.com/startswith2/4 .
Perhatikan bahwa ada 2 optimisasi loop yang disertakan Steve, yang pertama dari keduanya menunjukkan kinerja yang lebih baik, jadi saya akan memposting kode di bawah ini:
sumber
Karena ini sangat populer, saya pikir perlu menunjukkan bahwa ada implementasi untuk metode ini dalam ECMA 6 dan dalam persiapan untuk itu orang harus menggunakan polyfill 'resmi' untuk mencegah masalah dan air mata di masa depan.
Untungnya para ahli di Mozilla memberi kami satu:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
Harap dicatat bahwa ini memiliki keuntungan diabaikan dengan anggun pada transisi ke ECMA 6.
sumber
Solusi berkinerja terbaik adalah berhenti menggunakan panggilan perpustakaan dan hanya mengenali bahwa Anda bekerja dengan dua array. Implementasi linting tangan keduanya pendek dan juga lebih cepat daripada setiap solusi lain yang saya lihat di sini.
Untuk perbandingan kinerja (sukses dan gagal), lihat http://jsperf.com/startswith2/4 . (Pastikan Anda memeriksa versi selanjutnya yang mungkin memiliki versi palsu saya.)
sumber
Saya baru saja belajar tentang perpustakaan string ini:
http://stringjs.com/
Sertakan file js dan kemudian gunakan
S
variabel seperti ini:Itu juga dapat digunakan di NodeJS dengan menginstalnya:
Kemudian membutuhkannya sebagai
S
variabel:Halaman web juga memiliki tautan ke pustaka string alternatif, jika ini tidak sesuai keinginan Anda.
sumber
Saya pada dasarnya membutuhkan cara cepat untuk menemukan apakah jarum panjang berada dalam tumpukan jerami panjang dan mereka sangat mirip kecuali untuk karakter terakhir.
Berikut kode yang saya tulis yang untuk setiap fungsi (sambatan, substring, beginWith, dll.) Menguji keduanya ketika mereka mengembalikan false dan true terhadap string tumpukan jerami (
nestedString
) dari 1.000.0001 karakter dan string jarum palsu atau benar 1.000.000 karakter (testParentStringFalse
dantestParentStringTrue
, masing-masing):Saya menjalankan tes benchmark ini di Chrome 75 , Firefox 67 , Safari 12 dan Opera 62 .
Saya belum memasukkan Edge dan IE karena saya tidak memilikinya di mesin ini, tetapi jika seseorang dari Anda ingin menjalankan skrip terhadap Edge dan setidaknya IE 9 dan membagikan hasilnya di sini saya akan sangat penasaran untuk melihat hasilnya.
Hanya ingat bahwa Anda perlu membuat ulang 3 string panjang dan menyimpan skrip dalam file yang kemudian Anda buka di browser Anda karena copy / paste pada konsol browser akan memblokirnya karena setiap panjang string adalah> = 1.000.000).
Berikut ini hasilnya:
Chrome 75 (
substring
menang):Firefox 67 (
indexOf
menang):Safari 12 (
slice
menang untuk hasil palsu,startsWith
menang untuk hasil nyata, juga Safari adalah yang tercepat dalam hal total waktu untuk melaksanakan seluruh tes):Opera 62 (
substring
menang. Hasil serupa dengan Chrome dan saya tidak terkejut karena Opera didasarkan pada Chromium dan Blink):Ternyata setiap browser memiliki detail implementasi sendiri (selain Opera, yang didasarkan pada Chromium dan Blink Chrome).
Tentu saja, pengujian lebih lanjut dengan kasus penggunaan yang berbeda dapat dan harus dilakukan (misalnya ketika jarum sangat pendek dibandingkan dengan tumpukan jerami, ketika tumpukan jerami lebih pendek dari jarum, dll ...), tetapi dalam kasus saya, saya perlu membandingkan string yang sangat panjang dan ingin membagikannya di sini.
sumber
sumber
Berdasarkan jawaban di sini, ini adalah versi yang saya gunakan sekarang, karena tampaknya memberikan kinerja terbaik berdasarkan pengujian JSPerf (dan secara fungsional lengkap sejauh yang saya tahu).
Ini didasarkan pada beginWith2 dari sini: http://jsperf.com/startswith2/6 . Saya menambahkan tweak kecil untuk peningkatan kinerja kecil, dan sejak itu juga menambahkan cek untuk string perbandingan menjadi nol atau tidak terdefinisi, dan mengubahnya untuk menambah prototipe String menggunakan teknik dalam jawaban CMS.
Perhatikan bahwa implementasi ini tidak mendukung parameter "posisi" yang disebutkan di halaman Jaringan Pengembang Mozilla ini , tetapi itu tampaknya tidak menjadi bagian dari proposal ECMAScript.
sumber
Saya tidak yakin untuk javascript tetapi dalam naskah saya melakukan sesuatu seperti
Saya kira itu harus bekerja pada js juga. Saya harap ini membantu!
sumber
Jika Anda bekerja
startsWith()
danendsWith()
kemudian Anda harus berhati-hati dalam memimpin ruang. Ini adalah contoh lengkapnya:sumber
startsWith()
danendsWith()
berfungsi. Tidak ada lagi!Anda juga dapat mengembalikan semua anggota array yang dimulai dengan string dengan membuat prototipe / ekstensi Anda sendiri ke prototipe array, alias
Dan untuk menggunakannya:
sumber