EcmaScript 6
Jika Anda menggunakan ES6, Anda bisa membuat array item, dan menggunakan includes
:
['a', 'b', 'c'].includes('b')
Ini memiliki beberapa manfaat yang melekat lebih indexOf
karena benar dapat menguji keberadaan dari NaN
dalam daftar, dan dapat mencocokkan hilang elemen array seperti yang tengah di [1, , 2]
untuk undefined
. includes
juga berfungsi pada array yang diketikkan JavaScript seperti Uint8Array
.
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 hilang includes
, saya sarankan polyfill.io untuk pengisian polyfilling.
Tanpa Array
Anda bisa menambahkan isInList
properti baru ke string sebagai berikut:
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
}
Kemudian gunakan seperti ini:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
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 benar NaN
, dan sementara itu bisa cocok dengan eksplisit undefined
, itu tidak dapat mencocokkan elemen yang hilang undefined
seperti dalam array [1, , 2]
.
Polyfill untuk indexOf
atau includes
di IE, atau browser / versi lain yang tidak memiliki dukungan
Jika 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:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
Namun, saya tidak berpikir memodifikasi Array.prototype
adalah jawaban terbaik dalam jangka panjang. Memodifikasi Object
dan membuat Array
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) dengan for ... in
akan mengembalikan nama fungsi baru sebagai salah satu kunci:
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
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 dengannya x
.
Cara ES6 baru untuk menghindari masalah ekstra-tombol ini adalah dengan menggunakan of
bukan in
, 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 menggunakan includes
seperti yang disebutkan di atas.