Periksa apakah array kosong atau null

107

Saya ingin tahu bagaimana memeriksa apakah sebuah array kosong atau null di jQuery. Saya mencoba array.length === 0tetapi tidak berhasil. Itu juga tidak menimbulkan kesalahan.

Ini kodenya:

var album_text = new Array();

$("input[name='album_text[]']").each(function(){
  if( $(this).val() &&  $(this).val() != '') {
    album_text.push($(this).val());
  }
});
if (album_text.length === 0) {
  $('#error_message').html("Error");
}

else {
  // send data
}
memasukkan
sumber
2
Cara yang sama seperti di "JavaScript normal": stackoverflow.com/questions/2672380/…
Julien Schmidt
1
@ Julien, saya mencoba semua solusi yang tercantum di utas itu sebelum memulai utas ini. Tak satu pun dari mereka berhasil.
masukan
Bisakah kita mendapatkan lebih banyak kode untuk konteks? Mengelilingi JavaScript, HTML? Apakah Anda yakin itu $("input[name='album_text[]']")benar-benar mengembalikan elemen?
Jon Adams
@JulienSchmidt: pertanyaan yang Anda tautkan adalah tentang memeriksa apakah nilai array kosong, bukan keseluruhan array.
Dan Dascalescu

Jawaban:

168

Selama pemilih Anda benar-benar berfungsi, saya tidak melihat ada yang salah dengan kode Anda yang memeriksa panjang array. Itu harus melakukan apa yang Anda inginkan. Ada banyak cara untuk membersihkan kode Anda agar lebih sederhana dan lebih mudah dibaca. Ini versi yang dibersihkan dengan catatan tentang apa yang saya bersihkan.

var album_text = [];

$("input[name='album_text[]']").each(function() {
    var value = $(this).val();
    if (value) {
        album_text.push(value);
    }
});
if (album_text.length === 0) {
    $('#error_message').html("Error");
}

else {
  //send data
}

Beberapa catatan tentang apa yang Anda lakukan dan apa yang saya ubah.

  1. $(this)selalu merupakan objek jQuery yang valid sehingga tidak ada alasan untuk memeriksanya if ($(this)). Ini mungkin tidak memiliki objek DOM di dalamnya, tetapi Anda dapat memeriksanya $(this).lengthjika perlu, tetapi itu tidak perlu di sini karena .each()loop tidak akan berjalan jika tidak ada item sehingga $(this)di dalam .each()loop Anda akan selalu menjadi sesuatu.
  2. Tidak efisien menggunakan $ (this) berkali-kali dalam fungsi yang sama. Jauh lebih baik untuk memasukkannya sekali ke dalam variabel lokal dan kemudian menggunakannya dari variabel lokal itu.
  3. Direkomendasikan untuk menginisialisasi array dengan []daripada new Array().
  4. if (value)ketika nilai diharapkan menjadi string akan baik melindungi dari value == null, value == undefineddan value == ""sehingga Anda tidak perlu melakukan if (value && (value != "")). Anda tinggal melakukan: if (value)untuk memeriksa ketiga kondisi kosong.
  5. if (album_text.length === 0) akan memberi tahu Anda jika array kosong selama itu adalah array yang valid dan diinisialisasi (yang ada di sini).

Apa yang Anda coba lakukan dengan pemilih ini $("input[name='album_text[]']")?

jfriend00
sumber
5
@MaciekSemik - lihat stackoverflow.com/questions/359494/… . Saya selalu menggunakan kesetaraan ketat ( ===) kecuali saya secara khusus ingin mengizinkan konversi jenis. Ini adalah kebiasaan yang baik untuk dilakukan.
jfriend00
73

Pengguna JQuery adalah EmptyObject untuk memeriksa apakah array berisi elemen atau tidak.

var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true
Mayank Raipure
sumber
2
Jauh lebih dapat diandalkan daripada memeriksa panjangnya, terutama jika variabel Anda juga dapat berupa objek (dengan objek, panjang tidak berfungsi untuk memeriksa apakah kosong).
rajin
Ini jawaban yang lebih tepat menurut saya.
earl3s
4
isEmptyObjectselalu mengembalikan falsejika Array.prototypediperpanjang, misalnya Array.prototype.someFunction = function () {};- bahkan jika array kosong. Perhatikan bahwa beberapa kerangka kerja (misalnya Ember.js) memperluas prototipe Array secara default.
jesenko
4
Berhati-hatilah isEmptyObject! Untuk jQuery 1.8.3 jQuery.isEmptyObject([])mengembalikan false, tetapi untuk jQuery 1.11.3 mengembalikan true. Sebenarnya, dokumentasi jQuery mengatakan Argumen harus selalu berupa Objek JavaScript biasa karena jenis objek lain (elemen DOM, string / angka primitif, objek host) mungkin tidak memberikan hasil yang konsisten di seluruh browser. Maaf, tidak melihat jawaban @rhinoxi.
Dmitry Vershinin
8

Anda harus memeriksa ''(string kosong) sebelum mendorong ke dalam array Anda. Array Anda memiliki elemen yang berupa string kosong. Maka keinginanmu album_text.length === 0akan bekerja dengan baik.

Daniel A. White
sumber
Silakan lihat kode yang diperbarui. Saya menambahkan kode ini if( $(this).val() && $(this).val() != '') namun tidak berhasil.
masukan
8

Saya pikir berbahaya menggunakan $ .isEmptyObject dari jquery untuk memeriksa apakah array kosong, seperti yang disebutkan @jesenko. Saya baru saja bertemu masalah itu.

Dalam dokumen isEmptyObject , itu menyebutkan:

Argumennya harus selalu berupa Objek JavaScript biasa

yang dapat Anda tentukan $.isPlainObject. Kembalinya $.isPlainObject([])salah.

rhinoxi
sumber