Periksa apakah array kosong atau ada

358

Ketika halaman memuat untuk pertama kalinya, saya perlu memeriksa apakah ada gambar di dalam image_arraydan memuat gambar terakhir.

Kalau tidak, saya menonaktifkan tombol pratinjau, mengingatkan pengguna untuk menekan tombol gambar baru dan membuat array kosong untuk meletakkan gambar;

Masalahnya adalah bahwa image_arraydalam elsekebakaran sepanjang waktu. Jika ada array - hanya menimpanya, tetapi lansiran tidak berfungsi.

if(image_array.length > 0)
    $('#images').append('<img src="'+image_array[image_array.length-1]+'" class="images" id="1" />');
else{
    $('#prev_image').attr('disabled', 'true');
    $('#next_image').attr('disabled', 'true');
    alert('Please get new image');
    var image_array = [];
}

PEMBARUAN Sebelum memuat html, saya memiliki sesuatu seperti ini:

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>
pengguna1564141
sumber
Log konsol image_array- apa yang Anda dapatkan?
Utkanos
@Utkanos jika ada var image_array = [] - tidak terdefinisi jika // var image_array = [] (diciptakan) - array nyata.
user1564141
array? .length - didukung luas dan akan segera menjadi fitur asli
Anbu Agarwal

Jawaban:

517
if (typeof image_array !== 'undefined' && image_array.length > 0) {
    // the array is defined and has at least one element
}

Masalah Anda mungkin terjadi karena campuran variabel global implisit dan variabel yang diangkat. Pastikan Anda menggunakan varsetiap kali mendeklarasikan variabel:

<?php echo "var image_array = ".json_encode($images);?>
// add var  ^^^ here

Dan kemudian pastikan Anda tidak pernah secara tidak sengaja mendeklarasikan ulang variabel itu nanti:

else {
    ...
    image_array = []; // no var here
}
jaby
sumber
33
Nggak. Ini akan meledak ketika image_array adalah nol. Hukum Murphy menyatakan bahwa suatu hari kelak akan demikian.
Marco Faustinelli
7
Tidak image_array.lengthcukup? (tanpa menentukan >0)
mcont
Penasaran: Dapatkan Anda menemukan use case yang akan rusak menggunakan jawaban @JamesDrinkard?
tsemer
12
if (image_array && image_array.length){ // array exists and has elements
YeeHaw1234
195

Untuk memeriksa apakah array kosong atau tidak

Cara modern, ES5 +:

if (Array.isArray(array) && array.length) {
    // array exists and is not empty
}

Cara jadul:

typeof array != "undefined"
    && array != null
    && array.length != null
    && array.length > 0

Cara yang ringkas:

if (typeof array != "undefined" && array != null && array.length != null && array.length > 0) {
    // array exists and is not empty
}

Cara CoffeeScript:

if array?.length > 0

Mengapa?

Case Undefined
Variabel tidak terdefinisi adalah variabel yang belum Anda tetapkan untuknya.

let array = new Array();     // "array" !== "array"
typeof array == "undefined"; // => true

Case Null
Secara umum, null adalah keadaan tidak memiliki nilai. Misalnya variabel nol ketika Anda melewatkan atau gagal mengambil beberapa data.

array = searchData();  // can't find anything
array == null;         // => true

Kasus Bukan Array
Javascript memiliki sistem tipe dinamis. Ini berarti kami tidak dapat menjamin jenis objek apa yang dipegang variabel. Ada kemungkinan bahwa kita tidak berbicara dengan contoh Array.

supposedToBeArray =  new SomeObject();
typeof supposedToBeArray.length;       // => "undefined"

array = new Array();
typeof array.length;                   // => "number"

Case Empty Array
Sekarang karena kami menguji semua kemungkinan lain, kami sedang berbicara dengan contoh Array. Untuk memastikan itu tidak kosong, kami bertanya tentang jumlah elemen yang dipegangnya, dan memastikan elemennya lebih dari nol.

firstArray = [];
firstArray.length > 0;  // => false

secondArray = [1,2,3];
secondArray.length > 0; // => true
Pooyan Khosravi
sumber
8
Harap dicatat bahwa tidak cukup hanya memeriksa (typeof array != "undefined" && array.length > 0)karena jika arraynol kita akan dapatkan TypeError: Cannot read property 'length' of null.
Pooyan Khosravi
Mungkin ganti && dengan ||
Sahar Ch.
!(typeof array !== "undefined") || !(array.length > 0)? Baru mencobanya, ada kesalahan yang sama. Bisakah Anda memberi kami contoh lengkap tentang cara menggunakan ||?
Pooyan Khosravi
Maksud saya(typeof array != "undefined" || array.length > 0)
Sahar Ch.
Terima kasih atas klarifikasi. (typeof array != "undefined" || array.length > 0)kembali truejika array = null. !(typeof array != "undefined" || array.length > 0)kembali falsejika array = [1,2]. Maaf karena tidak mengerti, tetapi @Elsa dapatkah Anda memberikan contoh yang berfungsi? Terima kasih sebelumnya.
Pooyan Khosravi
70

Bagaimana dengan (ECMA 5.1):

if(Array.isArray(image_array) && image_array.length){
  // array exists and is not empty
}
Queequeg
sumber
1
Re .. && image_array.length). IMHO, sementara Anda dapat dengan aman bergantung pada pengetikan JS yang longgar, untuk mengonversi 0bilangan bulat menjadi falsedan non-zerobilangan bulat true, saya menganggapnya lebih baik, agar mudah dibaca di masa depan, untuk "mengatakan apa yang Anda maksudkan". Saya akan lakukan .. && image_array.length > 0).
ToolmakerSteve
28

Inilah yang saya gunakan. Kondisi pertama mencakup kebenaran, yang memiliki nol dan tidak terdefinisi. Kondisi kedua memeriksa array kosong.

if(arrayName && arrayName.length > 0){
    //do something.
}

atau terima kasih atas komentar tsemer saya menambahkan versi kedua

if(arrayName && arrayName.length)

Lalu saya membuat tes untuk kondisi kedua, menggunakan Scratchpad di Firefox:

var array1;
var array2 = [];
var array3 = ["one", "two", "three"];
var array4 = null;

console.log(array1);
console.log(array2);
console.log(array3);
console.log(array4);

if (array1 && array1.length) {
  console.log("array1! has a value!");
}

if (array2 && array2.length) {
  console.log("array2! has a value!");
}

if (array3 && array3.length) {
  console.log("array3! has a value!");
}

if (array4 && array4.length) {
  console.log("array4! has a value!");
}

yang juga membuktikan itu if(array2 && array2.length)dan if(array2 && array2.length > 0)persis melakukan hal yang sama

James Drinkard
sumber
13
Saya menemukan ini sebagai yang paling ringkas dan mencakup semua masalah pengecualian. Dan karena Anda menyukai kebenaran, bahkan bisa puas denganif (arrayName && arrayName.length)
tsemer
2
Singkat dan cepat! Butuh beberapa saat dari C # untuk membiasakan diri jika (obj) mengecek null, tapi sekarang aku menyukainya: if (obj) // null check; if (array && array.length) // array null atau kosong; if (array &&! array.length) // array ada, tetapi kosongkan centangnya; if (str) // string tidak null dan tidak kosong. Gotcha hanya tidak digunakan pada angka jika nol adalah angka yang valid.
Rick Love
1
Saya telah menggunakan (arrayName && arrayName.length) untuk sementara waktu kemudian saya khawatir jika ada sesuatu yang salah tentang hal itu. Jawaban ini menghibur saya, terima kasih :)
Koray
Dalam naskah ada nuansa, karena untuk var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0tipe isNotEmpty tidak akan boolean, itu akan menjadi boolean | undefined.
Giedrius
15

Kamu harus menggunakan:

  if (image_array !== undefined && image_array.length > 0)
Samson
sumber
8

Jika Anda ingin menguji apakah variabel array gambar telah ditentukan, Anda dapat melakukannya seperti ini

if(typeof image_array === 'undefined') {
    // it is not defined yet
} else if (image_array.length > 0) {
    // you have a greater than zero length array
}
Mike Brant
sumber
Tidak berfungsi dl.dropbox.com/u/14396564/screens/…
user1564141
@ user1564141 sulit untuk mengatakan di mana fungsi tersebut dinyatakan relatif terhadap image_array Anda sedang diatur. Anda mungkin mengalami masalah hosting, jadi Anda mungkin perlu mendeklarasikan variabel itu sebagai var index_array = ... Juga, adalah tag skrip tempat Anda mengatur index_array ditutup. Itu tidak muncul dari screenshot.
Mike Brant
Di tempat lain juga waspada, yang diaktifkan hanya ketika array kosong, tetapi var image_array bekerja setiap saat ... Saya tidak mengerti mengapa?
user1564141
@ user1564141 Ini akan membantu jika Anda dapat memperbarui pertanyaan Anda untuk menunjukkan sumber sebagai output. Saya masih belum merasakan di mana logika if-else Anda berada di dalam sumber relatif terhadap lokasi deklarasi index_array Anda.
Mike Brant
6

JavaScript

( typeof(myArray) !== 'undefined' && Array.isArray(myArray) && myArray.length > 0 )

Lodash & Garis Bawah

( _.isArray(myArray) && myArray.length > 0 )
Amit Bhagat
sumber
6

Anda dapat menggunakan jQuery's isEmptyObject()untuk memeriksa apakah array mengandung elemen atau tidak.

var testArray=[1,2,3,4,5]; 
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true 

Sumber: https://api.jquery.com/jQuery.isEmptyObject/

Mayank Raipure
sumber
Ini adalah satu-satunya hal yang berfungsi untuk saya ketika menambahkan elemen dengan array.push () - dari elemen yang ditambahkan secara dinamis (ajax). Terima kasih
TomoMiha
3

Cara sederhana yang tidak menghasilkan pengecualian jika tidak ada dan dikonversi ke boolean:

!!array

Contoh:

if (!!arr) {
  // array exists
}
lambang
sumber
3

Bagaimana dengan ini ? memeriksa panjang array yang tidak terdefinisi dapat membuang pengecualian.

if(image_array){
//array exists
    if(image_array.length){
    //array has length greater than zero
    }
}
Nikul Patel
sumber
Sarang ifdapat dihindari menggunakan &&, karena image_array && image_array.length, akan korsleting jika image_arraytidak ada.
rvazquezglez
3

Bagi saya yakin beberapa jawaban dengan nilai tinggi "berfungsi" ketika saya memasukkannya ke jsfiddle, tetapi ketika saya memiliki jumlah array yang dihasilkan secara dinamis, banyak kode ini dalam jawaban yang tidak berfungsi untuk saya.

Inilah yang bekerja untuk saya.

var from = [];

if(typeof from[0] !== undefined) {
  //...
}

Perhatikan, TIDAK ada kutipan di sekitar yang tidak ditentukan dan saya tidak peduli dengan panjangnya.

Tom Stickel
sumber
1
dua komentar: 1) typeofmengembalikan string, membandingkannya dengan undefinedselalu flasy 2) Anda tidak memeriksa apakah fromdidefinisikan. kode Anda di atas akan menimbulkan kesalahan jika tidak
Xeltor
@Tortor Tidak, itu tidak akan. berikan jsfiddle atau penyelam Anda untuk membuktikan ini atau hapus komentar Anda.
Tom Stickel
@Tortor, hanya melihat dan tampaknya jawaban Anda memiliki -2 dan penuh dengan komentar dengan orang-orang yang mengatakan dalam BOLD bahwa Anda salah.
Tom Stickel
3

rantai opsional

Saat proposal perangkaian opsional mencapai tahap 4 dan mendapatkan dukungan yang lebih luas, ada cara yang sangat elegan untuk melakukan ini

if(image_array?.length){

  // image_array is defined and has at least one element

}
LonelyCpp
sumber
2

Saya menemukan masalah ini cukup banyak di Javascript. Bagi saya cara terbaik untuk melakukannya adalah dengan melakukan pemeriksaan yang sangat luas sebelum memeriksa panjang. Saya melihat beberapa solusi lain dalam T&J ini, tetapi saya ingin dapat memeriksa salah nullatau undefinedatau nilai salah lainnya.

if(!array || array.length == 0){
    console.log("Array is either empty or does not exist")
}

Ini pertama akan memeriksa undefined, nullatau nilai-nilai palsu lainnya. Jika ada yang benar, itu akan menyelesaikan boolean karena ini adalah OR. Maka pemeriksaan yang lebih berisiko array.length, yang dapat membuat kesalahan kita jika array tidak didefinisikan, dapat diperiksa. Ini tidak akan pernah tercapai jika arrayini undefinedatau null, sehingga pemesanan kondisi sangat penting.

Jim Factor
sumber
2

Menggunakan undescore atau lodash :

_.isArray(image_array) && !_.isEmpty(image_array)

Vitaly
sumber
1

Berikut ini adalah solusi saya dibungkus dengan fungsi yang juga melempar kesalahan untuk mengelola beberapa masalah dengan cakupan objek dan semua jenis tipe data yang mungkin diteruskan ke fungsi.

Inilah biola saya yang digunakan untuk memeriksa masalah ini ( sumber )

var jill = [0];
var jack;
//"Uncaught ReferenceError: jack is not defined"

//if (typeof jack === 'undefined' || jack === null) {
//if (jack) {
//if (jack in window) {
//if (window.hasOwnP=roperty('jack')){
//if (jack in window){

function isemptyArray (arraynamed){
    //cam also check argument length
  if (arguments.length === 0) { 
    throw "No argument supplied";
  }

  //console.log(arguments.length, "number of arguments found");
  if (typeof arraynamed !== "undefined" && arraynamed !== null) {
      //console.log("found arraynamed has a value");
      if ((arraynamed instanceof Array) === true){
        //console.log("I'm an array");
        if (arraynamed.length === 0) {
            //console.log ("I'm empty");
            return true;
        } else {
          return false;
        }//end length check
      } else {
        //bad type
        throw "Argument is not an array";
      } //end type check
  } else {
    //bad argument
    throw "Argument is invalid, check initialization";;
  }//end argument check
}

try {
  console.log(isemptyArray(jill));
} catch (e) {
    console.log ("error caught:",e);
}
Tommie C.
sumber
0

Jika Anda tidak memiliki variabel yang dideklarasikan sebagai array, Anda dapat membuat tanda centang:

if(x && x.constructor==Array && x.length){
   console.log("is array and filed");
}else{
    var x= [];
    console.log('x = empty array');
}

Ini memeriksa apakah variabel x ada dan jika ada, memeriksa apakah itu array yang diisi. selain itu menciptakan array kosong (atau Anda dapat melakukan hal-hal lain);

Jika Anda yakin ada variabel array yang dibuat ada pemeriksaan sederhana:

var x = [];

if(!x.length){
    console.log('empty');
} else {
    console.log('full');
}

Anda dapat memeriksa biola saya di sini dengan menunjukkan cara yang paling mungkin untuk memeriksa array.

Plippie
sumber
0

Anda harus melakukan ini

    if (!image_array) {
      // image_array defined but not assigned automatically coerces to false
    } else if (!(0 in image_array)) {
      // empty array
      // doSomething
    }
shivam malhotra
sumber
0

Saya pikir kode sederhana ini akan berfungsi:

if(!(image_array<=0)){
//Specify function needed
}
Sachini Witharana
sumber
-1

dalam ts

 isArray(obj: any) 
{
    return Array.isArray(obj)
  }

dalam html

(foto == undefined ||! (isArray (foto) && photos.length> 0))

velan
sumber
3
Apa kamu yakin akan hal itu? Bagian kedua tidak terlihat seperti HTML
Nico Haase
-3

Ketika Anda membuat image_array Anda, itu kosong, oleh karena itu image_array.length Anda adalah 0

Seperti yang dinyatakan dalam komentar di bawah ini, saya mengedit jawaban saya berdasarkan jawaban pertanyaan ini ):

var image_array = []

di dalam kurung lain tidak mengubah apa pun ke image_array yang didefinisikan sebelumnya dalam kode

Al_th
sumber
Saya memilikinya di sumber, ketika memuat halaman ... Hanya lupa untuk mengirim.
user1564141
Saya ingin menambahkan sesuatu ke jawaban saya yang mungkin salah jadi saya nyatakan di sini. Dalam bahasa umum, apa yang dibuat di dalam blok tidak terlihat "di luar" blok. Ketika Anda mendefinisikan []var image_array = []di dalam blok lain, saya tidak yakin itu bisa dilihat di luar. Cobaimage_array = []
Al_th
tetapi jika saya menghapus image_array dari yang lain semuanya berfungsi dengan baik.
user1564141