Saya mencoba menulis fungsi yang dapat menerima daftar string, atau string tunggal. Jika ini sebuah string, maka saya ingin mengonversinya menjadi sebuah array hanya dengan satu item, jadi saya dapat mengulanginya tanpa takut ada kesalahan.
Jadi bagaimana cara saya memeriksa apakah variabel adalah array?
Saya telah mengumpulkan berbagai solusi di bawah ini dan membuat tes jsperf . Mereka semua cepat, jadi gunakan saja Array.isArray
- sekarang didukung dengan baik dan bekerja di seluruh bingkai .
arr.constructor === Array
tercepat.arr.constructor === Array
tes itu akan kembali salah.Array.isArray(arr)
masih mengembalikan true.Jawaban:
Di browser modern yang dapat Anda lakukan
( Didukung oleh Chrome 5, Firefox 4.0, IE 9, Opera 10.5 dan Safari 5)
Untuk kompatibilitas mundur Anda dapat menambahkan yang berikut ini
Jika Anda menggunakan jQuery, Anda dapat menggunakan
jQuery.isArray(obj)
atau$.isArray(obj)
. Jika Anda menggunakan garis bawah, Anda dapat menggunakan_.isArray(obj)
Jika Anda tidak perlu mendeteksi array yang dibuat dalam bingkai yang berbeda, Anda juga bisa menggunakannya
instanceof
sumber
Array.isArray
if (typeof Array.isArray === 'undefined') {
dapat diubah menjadiif(!Array.isArray) {
Object.prototype.string.call(obj)
dapat dipalsukan jika bendaSymbol.toStringTag
itu ada di atasnya. Yang mengatakan saya tidak mengetahui adanya lingkungan yang mengirimSymbol.toStringTag
tetapi tidakArray.isArray
jadi ini tampaknya aman.instanceof Array
gagal jika array berasal dari frame yang berbeda?instanceof Array
gagal jika array berasal dari frame yang berbeda karena setiap array dari frame yang berbeda memilikiArray
konstruktor dan prototipe yang berbeda . Untuk alasan kompatibilitas / keamanan, setiap frame memiliki lingkungan globalnya sendiri, dan ini termasuk objek global. TheObject
global dari satu frame berbeda dariObject
global dari yang lain. Begitu juga untukArray
global. Axel Rauschmayer berbicara lebih banyak tentang ini .Metode yang diberikan dalam standar ECMAScript untuk menemukan kelas Objek adalah dengan menggunakan
toString
metode dariObject.prototype
.Atau Anda dapat menggunakan
typeof
untuk menguji apakah itu sebuah String:Atau jika Anda tidak peduli dengan kinerja, Anda bisa melakukan
concat
ke Array kosong yang baru.Ada juga konstruktor yang dapat Anda query langsung:
Lihat pengobatan menyeluruh dari blog @TJ Crowder , seperti yang diposting di komentarnya di bawah ini.
Lihatlah patokan ini untuk mendapatkan ide metode mana yang berkinerja lebih baik: http://jsben.ch/#/QgYAV
Dari @Bharath convert string to array menggunakan Es6 untuk pertanyaan yang diajukan:
seharusnya:
sumber
toString
adalah salah satu cara untuk melakukannya. Saya melakukan sedikit pengumpulan ditypeof new String('beans')
> 'object'Array.isArray(obj)
Pertama-tama saya akan memeriksa apakah implementasi Anda mendukung
isArray
:Anda juga dapat mencoba menggunakan
instanceof
operatorsumber
v instanceof Array
akan mengembalikan false jikav
dibuat di bingkai lain (v
adalah instance darithatFrame.contentWindow.Array
kelas).Array.isArray
didefinisikan sebagai bagian dari ECMAScript 5 / Javascript 1.8.5.return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
jQuery juga menawarkan
$.isArray()
metode:sumber
$.isArray === Array.isArray
kembali benar.Array.isArray
balik layar: github.com/jquery/jquery/blob/master/src/core.js#L211Ini adalah yang tercepat di antara semua metode (semua browser didukung):
sumber
if (obj && Array === obj.constructor)
sebagai lawanif (obj && obj.constructor === Array)
? Apakah itu hilang dalam terjemahan ke bahasa Inggris, lalu ke kode hal? misal, penutur bahasa Inggris umumnya cenderung bertanya "apakah objek itu ada, dan apakah konstruktornya berasal dari kelas array?", jadi kodenya mengalir ketika membacanya lebih logis. atau adakah alasan teknis?function object_type(o){var t = typeof(o);return ((t==="object") && (o.constructor===Array)) ? "array" : t;} /*allows you to */ switch(object_type(o)){ case 'array': break; case 'object' : o.dosomething();}
Bayangkan Anda memiliki array ini di bawah ini :
Javascript (browser baru dan lama):
atau
atau
kemudian panggil seperti ini:
Javascript (IE9 +, Ch5 +, FF4 +, Saf5 +, Opera10.5 +)
jQuery:
Sudut:
Garis Bawah dan Lodash:
sumber
Array.isArray bekerja dengan cepat, tetapi tidak didukung oleh semua versi browser. Jadi Anda bisa membuat pengecualian untuk orang lain dan menggunakan metode universal:
sumber
.toString()
metode dariObject.prototype
. Saat ini Anda menggunakanwindow.toString()
, yang tidak sama.window.toString
lakukan hal yang sama sepertiObject.prototype.toString
di Chrome.Fungsi sederhana untuk memeriksa ini:
sumber
return object.constructor === Array
- tetapi apakah Anda yakin ini hanya akan mengembalikan true untuk array?if(x) return true; else return false
:-) Bahkan jika mundur, Anda harus meniadakan ekspresi.Seperti yang dikatakan MDN di sini :
Seperti ini:
Object.prototype.toString.call(arr) === '[object Array]'
, atauArray.isArray(arr)
sumber
Hanya ada satu solusi garis untuk pertanyaan ini
di mana x adalah variabel itu akan mengembalikan true jika x adalah array dan false jika bukan.
sumber
typeof
perbandingan.{}
array, maka Anda mendapatkan kesalahan sintaksis.Anda bisa memeriksa tipe variabel Anda apakah array dengan;
sumber
instanceof
.. Saya pikir itu gagal di bawah beberapa skenario aneh.Saya akan membuat fungsi untuk menguji jenis objek yang Anda hadapi ...
maka Anda dapat menulis pernyataan sederhana jika ...
sumber
Saya melakukan ini dengan cara yang sangat sederhana. Bekerja untukku. Adakah kekurangannya?
sumber
{isArray:true}
JSON.parse(someDataFromElsewhere).items.isArray
dapat mengembalikan true (tergantung pada data) dan memecahkan kode Anda.Ini adalah upaya saya untuk memperbaiki jawaban ini dengan mempertimbangkan komentar:
Ini menghilangkan if / else, dan menjelaskan kemungkinan array menjadi null atau tidak terdefinisi
sumber
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray
sumber
Saya telah memperbarui biola jsperf dengan dua metode alternatif serta pengecekan kesalahan.
Ternyata metode yang mendefinisikan nilai konstan dalam prototipe 'Objek' dan 'Array' lebih cepat daripada metode lainnya. Ini adalah hasil yang agak mengejutkan.
Kedua metode ini tidak berfungsi jika variabel mengambil nilai yang tidak ditentukan, tetapi mereka berfungsi jika Anda yakin bahwa mereka memiliki nilai. Berkenaan dengan memeriksa dengan kinerja dalam pikiran jika suatu nilai adalah array atau nilai tunggal, metode kedua terlihat seperti metode cepat yang valid. Itu sedikit lebih cepat daripada 'instanceof' di Chrome, dua kali lebih cepat dari metode terbaik kedua di Internet Explorer, Opera dan Safari (di komputer saya).
sumber
Saya tahu, bahwa orang mencari semacam pendekatan javascript mentah. Tetapi jika Anda tidak ingin memikirkannya, silakan lihat di sini: http://underscorejs.org/#isArray
Mengembalikan nilai true jika objek adalah Array.
sumber
Solusi terbaik yang saya lihat adalah penggantian lintas-browser untuk typeof. Lihat solusi Angus Croll di sini .
Versi TL; DR ada di bawah ini, tetapi artikel ini adalah diskusi yang bagus tentang masalah ini sehingga Anda harus membacanya jika Anda punya waktu.
sumber
Inilah pendekatan malas saya:
Saya tahu itu penghinaan untuk "mengacaukan" prototipe, tetapi tampaknya berperforma lebih baik daripada
toString
metode yang direkomendasikan .Catatan: Jebakan dari pendekatan ini adalah bahwa ia tidak akan bekerja melintasi
iframe
batas , tetapi untuk kasus penggunaan saya ini bukan masalah.sumber
wat = {array_: true}
benda.obj.array_ = true
, maka Anda hanya membodohi diri sendiri .cache
objek untuk memoize hasil pencarian yang menggunakan string pencarian sebagai kunci properti. Bagaimana jika pengguna mencariarray_
? Apakah objek Anda menjadi array karena itu? Itu hanya bug..array_
digunakan untuk menandai array. Itu benar-benar tidak terjadi di sini,.array
bisa berarti apa saja. Anda setidaknya harus menggunakan string deskriptif, dan menandakan ketidaksesuaian penggunaan sewenang-wenang, misalnya dengan.__isArray = true
.Ada contoh yang bagus dalam buku Pola Pola Stoyan Stefanov JavaScript yang seharusnya menangani semua masalah yang mungkin terjadi serta memanfaatkan metode ECMAScript 5 Array.isArray () .
Jadi begini:
Omong-omong, jika Anda menggunakan jQuery, Anda dapat menggunakan metode itu $ .isArray ()
sumber
if(!Array.isArray) {...
?cara termudah dan tercepat untuk memeriksa apakah Obyek adalah Array atau tidak.
atau
atau Anda dapat membuat fungsi utilitas:
pemakaian:
sumber
Berikut ini dapat digunakan jika Anda tahu bahwa objek Anda tidak memiliki metode concat.
sumber
Anda bisa adalah metode isArray tapi saya lebih suka memeriksanya
Object.getPrototypeOf(yourvariable) === Array.prototype
sumber
Object.getPrototypeOf(yourvariable)
itu mengembalikan prototipe objek Array. Dan kodenya tercepat dan aman untuk diandalkan.Jika hanya dua jenis nilai yang bisa diteruskan ke fungsi ini adalah string atau array string, tetap sederhana dan gunakan tanda
typeof
centang untuk kemungkinan string:sumber
Mencari versi terpendek di sini adalah apa yang saya dapatkan sejauh ini.
Catatan, tidak ada fungsi sempurna yang akan selalu mendeteksi semua kemungkinan kombinasi. Lebih baik mengetahui semua kemampuan dan keterbatasan alat Anda daripada mengharapkan alat ajaib.
sumber
A.map !== undefined
tapi ya, itu bisa jadi jalan licin di dunia patchers monyet;)sumber
Fungsi sederhana untuk menguji apakah nilai input adalah array adalah sebagai berikut:
Ini berfungsi lintas browser, dan dengan browser yang lebih lama. Ini ditarik dari posting blog TJ Crowders
sumber
Anda dapat mencoba ini:
sumber
Fungsi ini akan mengubah hampir semua hal menjadi array:
Ini menggunakan beberapa fitur browser yang lebih baru sehingga Anda mungkin ingin mengisi ini untuk dukungan maksimal.
Contoh:
String NB akan dikonversi menjadi array dengan elemen tunggal, bukan array karakter. Hapus
isString
centang jika Anda lebih suka sebaliknya.Saya sudah menggunakan di
Array.isArray
sini karena ini yang paling kuat dan juga paling sederhana.sumber
Dalam kasus Anda, Anda dapat menggunakan
concat
metode Array yang dapat menerima objek tunggal serta array (dan bahkan digabungkan):concat
tampaknya menjadi salah satu metode tertua Array (bahkan IE 5.5 tahu dengan baik).sumber