Saya sedang memeriksa variabel, katakanlah foo
, untuk kesetaraan ke sejumlah nilai. Sebagai contoh,
if( foo == 1 || foo == 3 || foo == 12 ) {
// ...
}
Intinya adalah bahwa itu agak banyak kode untuk tugas sepele seperti itu. Saya datang dengan yang berikut:
if( foo in {1: 1, 3: 1, 12: 1} ) {
// ...
}
tetapi juga ini tidak sepenuhnya menarik bagi saya, karena saya harus memberikan nilai yang berlebihan pada item dalam objek.
Apakah ada yang tahu cara yang layak untuk melakukan pemeriksaan kesetaraan terhadap beberapa nilai?
javascript
pimvdb
sumber
sumber
Jawaban:
Anda bisa menggunakan array dan
indexOf
:sumber
indexOf
hanya tersedia sejak ECMAScript edisi ke-5.Di ECMA2016 Anda dapat menggunakan metode include . Itu cara terbersih yang pernah kulihat. (Didukung oleh semua browser utama, kecuali IE (Polyfill ada di tautan)
sumber
if([a,b,c].includes(foo))
atau stringif(['a','b','c'].includes(foo))
if([a,b,c].includes(foo))
karena tanda kutip akan membuatnya string. @HastigZusammenstellenDengan menggunakan jawaban yang diberikan, saya berakhir dengan yang berikut:
Ini bisa disebut seperti:
Sunting: Saya menemukan 'trik' ini akhir-akhir ini yang berguna jika nilainya string dan tidak mengandung karakter khusus. Untuk karakter khusus menjadi jelek karena melarikan diri dan juga lebih rentan kesalahan karena itu.
Untuk lebih tepatnya, ini akan memeriksa string yang tepat, tetapi sekali lagi lebih rumit untuk tes kesetaraan sederhana:
sumber
in
adalah kata kunci dalam Javascript. Misalnya, menjalankanfunction in() {}; in()
hasil dalam kesalahan sintaks, setidaknya di Firefox, dan saya tidak yakin mengapa kode Anda tidak. :-)Object.prototype
, karena memengaruhifor (foo in bar)
dengan cara yang tidak menguntungkan. Mungkin mengubahnya kefunction contains(obj) { for (var i = 1; i < arguments.length; i++) if (arguments[i] === obj) return true; return false; }
dan meneruskan objek sebagai argumen?Object.prototype
seperti yang Anda sebutkan. Namun, saya lebih suka cara ini, karena notasi untuk mengeceknya bagusfoo.in(1, 2, "test", Infinity)
, mudah, dan mudah.in()
dengan cara biasa juga gagal di Chrome, tetapi prototipe berfungsi ... :)Anda dapat menulis
if(foo in L(10,20,30))
jika AndaL
inginsumber
'remove' in L(1, 3, 12)
, meskipun Anda tidak tentukan 'hapus' untuk dimasukkan ke dalam daftar.Ini mudah diperpanjang dan dibaca:
Namun belum tentu lebih mudah :)
sumber
Perhatikan bahwa indexOf tidak ada dalam naskah ECMAS inti. Anda harus memiliki cuplikan untuk IE dan mungkin peramban lain yang tidak mendukung Array.prototype.indexOf.
sumber
Selain itu, karena nilai yang Anda periksa hasilnya unik, Anda juga dapat menggunakan Set.prototype.has () .
sumber
Sekarang Anda mungkin memiliki solusi yang lebih baik untuk menyelesaikan skenario ini, tetapi cara lain yang saya sukai.
Saya lebih suka solusi di atas daripada memeriksa indexOf di mana Anda perlu memeriksa indeks juga.
termasuk dokumen
sumber
Saya menyukai jawaban yang diterima, tetapi berpikir itu akan rapi untuk memungkinkannya mengambil array juga, jadi saya memperluasnya ke ini:
Anda dapat menghapus tipe pemaksaan dengan mengubah
==
ke===
.sumber
Jika Anda memiliki akses ke Garis Bawah, Anda dapat menggunakan yang berikut:
contains
dulu bekerja di Lodash juga (sebelum V4), sekarang Anda harus menggunakannyaincludes
sumber
Ini adalah fungsi aror pembantu kecil:
Info lebih lanjut di sini ...
sumber
const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].some(option => option === valToCheck); // false
includes
menjadi pilihan yang lebih baik, seperti dalam jawaban @ alister:const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].includes(valToCheck); // false
Saya hanya menggunakan fungsi jQuery inArray dan array nilai untuk mencapai ini:
sumber
Untuk anak cucu Anda mungkin ingin menggunakan ekspresi reguler sebagai alternatif. Dukungan browser yang cukup bagus juga (ref. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match#Browser_compatibility )
Coba ini
sumber