Dalam SQL kita dapat melihat apakah sebuah string ada dalam daftar seperti ini:
Column IN ('a', 'b', 'c')
Apa cara yang baik untuk melakukan ini dalam JavaScript? Sangat kikuk untuk melakukan ini:
if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
// do something
}
Dan saya tidak yakin dengan kinerja atau kejelasan ini:
if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
// do something
}
Atau seseorang dapat menggunakan fungsi sakelar:
var str = 'a',
flag = false;
switch (str) {
case 'a':
case 'b':
case 'c':
flag = true;
default:
}
if (expression1 || expression2 || flag) {
// do something
}
Tapi itu berantakan sekali. Ada ide?
Dalam hal ini, saya harus menggunakan Internet Explorer 7 karena itu untuk halaman intranet perusahaan. Jadi ['a', 'b', 'c'].indexOf(str) !== -1
tidak akan bekerja secara asli tanpa gula sintaks.
javascript
string
list
ErikE
sumber
sumber
Jawaban:
Anda dapat menghubungi
indexOf
:sumber
Array.prototype.indexOf
adalah bahwa itu tidak akan berfungsi pada IE, sayangnya bahkan IE8 tidak memiliki metode ini.Array.indexOf
ada sebelum overrideArray.prototype.indexOf
yang tidak hal yang sama. Saya akan merekomendasikan implementasi yang dibuat oleh Mozilla tersedia di sini: developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/…EcmaScript 6
Jika Anda menggunakan ES6, Anda bisa membuat array item, dan menggunakan
includes
:Ini memiliki beberapa manfaat yang melekat lebih
indexOf
karena benar dapat menguji keberadaan dariNaN
dalam daftar, dan dapat mencocokkan hilang elemen array seperti yang tengah di[1, , 2]
untukundefined
.includes
juga berfungsi pada array yang diketikkan JavaScript sepertiUint8Array
.Jika Anda khawatir tentang dukungan browser (seperti untuk IE atau Edge), Anda dapat memeriksa
Array.includes
di CanIUse.Com , dan jika Anda ingin menargetkan versi browser atau browser yang hilangincludes
, saya sarankan polyfill.io untuk pengisian polyfilling.Tanpa Array
Anda bisa menambahkan
isInList
properti baru ke string sebagai berikut:Kemudian gunakan seperti ini:
Anda dapat melakukan hal yang sama untuk
Number.prototype
.Array.indexOf
Jika Anda menggunakan browser modern,
indexOf
selalu berfungsi. Namun, untuk IE8 dan sebelumnya Anda akan memerlukan polyfill.Jika
indexOf
mengembalikan -1, item tidak ada dalam daftar. Berhati-hatilah, bahwa metode ini tidak akan memeriksa dengan benarNaN
, dan sementara itu bisa cocok dengan eksplisitundefined
, itu tidak dapat mencocokkan elemen yang hilangundefined
seperti dalam array[1, , 2]
.Polyfill untuk
indexOf
atauincludes
di IE, atau browser / versi lain yang tidak memiliki dukunganJika Anda tidak ingin menggunakan layanan seperti polyfill.io seperti yang disebutkan di atas, Anda selalu dapat memasukkan dalam polyfill khusus sesuai standar kode sumber Anda. Misalnya, Jaringan Pengembang Mozilla memiliki satu untuk
indexOf
.Dalam situasi ini di mana saya harus membuat solusi untuk Internet Explorer 7, saya "menggulirkan versi saya sendiri" dari
indexOf()
fungsi yang tidak sesuai standar:Namun, saya tidak berpikir memodifikasi
Array.prototype
adalah jawaban terbaik dalam jangka panjang. MemodifikasiObject
dan membuatArray
prototipe dalam JavaScript dapat menyebabkan bug serius. Anda perlu memutuskan apakah melakukannya aman di lingkungan Anda sendiri. Dari catatan utama adalah bahwa iterasi array (ketika Array.prototype telah menambahkan properti) denganfor ... in
akan mengembalikan nama fungsi baru sebagai salah satu kunci:Kode Anda mungkin berfungsi sekarang, tetapi saat seseorang di masa depan menambahkan pustaka JavaScript atau plugin pihak ketiga yang tidak dengan bersemangat melindungi terhadap kunci yang diwarisi, semuanya dapat rusak.
Cara lama untuk menghindari kerusakan itu adalah, selama enumerasi, untuk memeriksa setiap nilai untuk melihat apakah objek tersebut benar-benar memilikinya sebagai properti yang tidak diwariskan dengan
if (arr.hasOwnProperty(x))
dan baru kemudian bekerja dengannyax
.Cara ES6 baru untuk menghindari masalah ekstra-tombol ini adalah dengan menggunakan
of
bukanin
,for (let x of arr)
. Namun, kecuali Anda dapat menjamin bahwa semua kode dan pustaka pihak ketiga Anda benar-benar berpegang pada metode ini, maka untuk keperluan pertanyaan ini Anda mungkin hanya ingin menggunakanincludes
seperti yang disebutkan di atas.sumber
indexOf
disediakan oleh MDN. Ini pada dasarnya melakukan hal yang sama tetapi dengan beberapa hubung singkat untuk evaluasi mudah.Sebagian besar jawaban menyarankan
Array.prototype.indexOf
metode, satu-satunya masalah adalah bahwa itu tidak akan berfungsi pada versi IE apa pun sebelum IE9.Sebagai alternatif, saya meninggalkan Anda dua opsi lagi yang akan berfungsi di semua browser:
sumber
"HiFooThere"
- Saya akan menggunakan/^(?:Foo|Bar|Baz)$/
(mulai dari string, grup yang tidak menangkap, akhir string).indexOf
sekarang didukung di IE 9 dan di atas sesuai dengan MDN .Array memiliki
indexOf
metode yang dapat digunakan untuk mencari string:sumber
Trik yang saya gunakan adalah
Anda bisa melakukan sesuatu seperti
sumber
var i=a.length;while (i--) {/*use a[i]*/}
adalah metode loop tercepat (jika urutan terbalik diterima).Ini milik saya:
Yang ini lebih cepat jika Anda setuju dengan melewatkan array:
Inilah jsperf: http://jsperf.com/bmcgin-inlsit
sumber
Array
di prototipe: mungkin sesuatu sepertiArray.prototype.contains
.RegExp
bersifat universal, tetapi saya mengerti bahwa Anda bekerja dengan array. Jadi, periksa pendekatan ini. Saya menggunakannya untuk menggunakannya, dan ini sangat efektif dan sangat cepat!Anda juga dapat menerapkan beberapa modifikasi, yaitu:
Satu garis
Tidak sensitif huruf
Dan banyak lagi!
sumber
Menggunakan indexOf (tidak berfungsi dengan IE8).
Untuk mendukung IE8, Anda dapat menerapkan indexOf dari Mozilla.
Ekspresi Reguler melalui String.prototype.match (docs).
sumber
Sepertinya Anda perlu menggunakan fungsi in_array.
jQuery -> inArray
Prototipe -> Array.indexOf
Atau, lihat contoh ini jika Anda tidak menggunakan jQuery atau Prototype:
Stylistic note: variabel bernama thisthing thatthing, harus dinamai untuk memberi tahu Anda sesuatu tentang apa yang dikandungnya (kata benda).
sumber
Selain
indexOf
(yang disarankan oleh poster lain), menggunakan prototipe's Enumerable.include () dapat membuatnya lebih rapi dan ringkas:sumber
Terima kasih atas pertanyaannya, dan solusinya menggunakan metode Array.indexOf.
Saya menggunakan kode dari solusi ini untuk membuat fungsi inList () yang akan, IMO, membuat penulisan lebih mudah dan pembacaan menjadi lebih jelas:
PEMAKAIAN:
sumber
'Houston'.inList(['LA', 'New York', 'Houston'])
. Mungkinif (!String.prototype.inList) {String.prototype.inList = function(arr) {return arr.indexOf(this) >= 0};}
atau menggunakanwhile
metode Anda .Saya terkejut tidak ada yang menyebutkan fungsi sederhana yang mengambil string dan daftar.
sumber
int
, di mana sebagian orang mungkin akan menemukan pertanyaan ini mencaribool
imbalan. Kupikir itu mungkin membantu beberapa orang.Solusi saya menghasilkan sintaks seperti ini:
Dan saya menerapkan ini dengan memperluas prototipe Objek dasar, seperti ini:
Kita mungkin menamai metode ini dengan InArray (tapi mungkin bukan inArray) atau cukup dengan In.
Keuntungan: Sederhana, lugas, dan mendokumentasikan diri.
sumber
myValues[key];
mana myValues adalah objek dan kunci adalah string atau angka.Versi sederhana dari jawaban SLaks juga berfungsi:
.... karena string adalah semacam array itu sendiri. :)
Jika perlu, terapkan fungsi indexof untuk Internet Explorer seperti yang dijelaskan sebelumnya.
sumber