Bir dizinin boş olup olmadığını kontrol edin


358

Sayfa ilk kez image_arrayyüklendiğinde, içinde bir görüntü olup olmadığını kontrol etmem ve son görüntüyü yüklemem gerekiyor.

Aksi takdirde, önizleme düğmelerini devre dışı bırakır, kullanıcıyı yeni görüntü düğmesine basması konusunda uyarır ve görüntüleri koymak için boş bir dizi oluştururum;

Sorun şu ki image_array, elseyangınlarda her zaman. Bir dizi varsa - sadece onu geçersiz kılar, ancak uyarı çalışmaz.

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 = [];
}

GÜNCELLEME Html yüklemeden önce şöyle bir şey var:

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>

Konsol günlüğü image_array- ne elde edersiniz?
Utkanos

@ Var Varsa görüntü_array = [] - // var image_array = [] (comented) - gerçek dizi tanımsızsa.
user1564141

dizi? .length - yaygın olarak desteklenen ve yakında yerel bir özellik olacak
Anbu Agarwal

Yanıtlar:


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

Sorununuz, örtük global değişkenlerin ve değişken kaldırma işlemlerinin bir karışımı nedeniyle olabilir. varBir değişkeni bildirirken kullandığınızdan emin olun :

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

Ve sonra daha sonra yanlışlıkla bu değişkeni asla yeniden açıklamadığınızdan emin olun:

else {
    ...
    image_array = []; // no var here
}

33
Hayır! Bu, image_array boş olduğunda patlayacaktır. Murphy yasası bir gün olacağını söylüyor.
Marco Faustinelli

7
Değil mi image_array.lengthyeterli? (belirtmeden >0)
mcont

Meraklı: @ JamesDrinkard'ın cevabını kullanarak kırılacak herhangi bir kullanım durumu bulabilir misiniz?
tsemer

12
if (image_array && image_array.length){ // array exists and has elements
YeeHaw1234

195

Bir dizinin boş olup olmadığını kontrol etmek için

Modern bir yol, ES5 +:

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

Eski okul yolu:

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

Kompakt bir yol:

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

Bir CoffeeScript yolu:

if array?.length > 0

Neden?

Durum Tanımsız
Tanımsız değişken, henüz herhangi bir şey atamadığınız bir değişkendir.

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

Vaka Null
Genel olarak, null değeri olmayan bir durumdur. Örneğin, bazı verileri kaçırdığınızda veya alamadığınızda bir değişken null olur.

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

Array Değil
Javascript dinamik bir tip sistemine sahiptir. Bu, bir değişkenin ne tür bir nesne tuttuğunu garanti edemeyeceğimiz anlamına gelir. Bir örneğiyle konuşmadığımız bir şans var Array.

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

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

Case Empty Array
Şimdi diğer tüm olasılıkları test ettiğimizden bir örneğiyle konuşuyoruz Array. Boş olmadığından emin olmak için, tuttuğu öğe sayısını ve sıfırdan fazla öğeye sahip olduğundan emin olmak istiyoruz.

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

secondArray = [1,2,3];
secondArray.length > 0; // => true

8
Lütfen kontrol etmenin yeterli olmadığını unutmayın, (typeof array != "undefined" && array.length > 0)çünkü boşsa arrayalacağız TypeError: Cannot read property 'length' of null.
Pooyan Khosravi

Belki & ile ||
Sahar Ch.

!(typeof array !== "undefined") || !(array.length > 0)? Sadece denedim, aynı hatayı aldım. Bize nasıl kullanılacağına dair tam bir örnek verebilir misiniz ||?
Pooyan Khosravi

Demek istediğim(typeof array != "undefined" || array.length > 0)
Sahar Ch.

Açıklama için teşekkürler. eğer (typeof array != "undefined" || array.length > 0)döner . eğer döner . Anlamadığım için özür dilerim, ama @Elsa çalışan bir örnek verebilir misiniz? Şimdiden teşekkürler. truearray = null!(typeof array != "undefined" || array.length > 0)falsearray = [1,2]
Pooyan Khosravi

70

Peki ya (ECMA 5.1):

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

1
Re .. && image_array.length). IMHO, süre olabilir güvenle JS gevşek-yazma güvenmek, bir dönüştürme 0için tamsayı falseve bir non-zerokarşı tamsayı true"ne demek demek" için, gelecekte okunabilmesi için, tercih düşünün. Yapardım .. && image_array.length > 0).
ToolmakerSteve

28

Ben bunu kullanıyorum. İlk koşul, null ve undefined olan gerçeği kapsar. İkinci koşul boş bir dizi olup olmadığını denetler.

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

ya da tsemer'ın yorumu sayesinde ikinci bir versiyon ekledim

if(arrayName && arrayName.length)

Sonra Firefox'ta Scratchpad kullanarak ikinci durum için bir test yaptım:

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!");
}

bu da bunu kanıtlıyor if(array2 && array2.length)ve if(array2 && array2.length > 0)aynısını yapıyor


13
Bunu en özlü buluyorum ve tüm istisna konularını kapsıyorum. Ve gerçeği sevdiğinizden, hatta bunu yapabilirif (arrayName && arrayName.length)
tsemer

2
Kısa ve hızlı! Eğer null için kontrol etmek için (obj) alışmak için C # gelen bir süre aldı, ama şimdi onu seviyorum: if (obj) // null check; if (dizi && dizi.length) // dizi boş veya boş kontrol; (dizi &&! dizi.length) // dizi varsa, ancak boş kontrol; if (str) // dize boş değil. Eğer sıfır geçerli bir sayı ise tek gotcha sayılar üzerinde kullanmayın.
Rick Love

1
Bir süredir (arrayName && arrayName.length) kullanıyorum sonra bir şey bu konuda yanlış olabilir endişeli. Bu cevap beni teselli etti, teşekkürler :)
Koray

var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0Typcript'te nüanslar vardır, çünkü isNotEmpty için tip boolean olmaz, boolean | undefined olur.
Giedrius

15

Kullanmalısın:

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

8

Resim dizisi değişkeninin tanımlanıp tanımlanmadığını test etmek isterseniz, bunu şu şekilde yapabilirsiniz

if(typeof image_array === 'undefined') {
    // it is not defined yet
} else if (image_array.length > 0) {
    // you have a greater than zero length array
}


@ user1564141, ayarlanan resim_dizisine göre işlevin nerede bildirildiğini söylemek zor. Bir barındırma sorunu yaşıyor olabilirsiniz, bu nedenle bu değişkeni var index_array = ... olarak bildirmeniz gerekebilir. Ayrıca, index_array'ı kapatmayı ayarladığınız komut dosyası etiketidir. Ekran görüntüsünde görünmüyor.
Mike Brant

Başka bir uyarı da, wich sadece dizi boş olduğunda patlar, ama var image_array her zaman çalışır ... Neden anlayamıyorum?
user1564141

@ user1564141 Kaynağı çıktı olarak göstermek için sorunuzu güncelleyebilmeniz yardımcı olacaktır. Eğer if-else mantığınızın index_array bildiriminizin konumuna göre kaynak içinde bulunduğu yerde hala bir fikrim yok.
Mike Brant

6

JavaScript

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

Lodash ve Alt Çizgi

( _.isArray(myArray) && myArray.length > 0 )

6

isEmptyObject()Dizinin öğe içerip içermediğini kontrol etmek için jQuery's kullanabilirsiniz .

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

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


Dinamik olarak eklenen öğelerden (ajax) array.push () ile öğeler eklerken benim için çalışan tek şey budur. Teşekkürler
TomoMiha

3

Varsa istisnalara yol açmayan ve boole dönüştüren basit bir yol:

!!array

Misal:

if (!!arr) {
  // array exists
}

3

Buna ne dersin ? tanımlanmamış dizinin uzunluğunu kontrol etmek istisna atabilir.

if(image_array){
//array exists
    if(image_array.length){
    //array has length greater than zero
    }
}

İçeride ifolduğu &&gibi, iç içe geçmekten kaçınılabilir , image_array && image_array.lengthyoksa kısa devre image_arrayyapar.
rvazquezglez

3

Benim için bazı yüksek puanlı cevaplar "jsfiddle onları koymak ne zaman" iş emin, ama dinamik olarak oluşturulan bir dizi dizi listesi olduğunda cevaplar bu kod bir sürü sadece benim için çalışmıyor.

Bu benim için çalışıyor.

var from = [];

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

Dikkat, undefined etrafında tırnak yok ve ben uzunluğu ile rahatsız değil.


1
iki yorum: 1) typeofbir dize döndürür, karşılaştırıldığında undefinedher zaman şişe olacak 2) fromtanımlı olup olmadığını kontrol etmezsiniz . yukarıdaki kodunuz değilse bir hata verir
Xeltor

@Xeltor Hayır olmayacak. lütfen bunu kanıtlamak veya yorumunuzu kaldırmak için jsfiddle veya plunkerınızı sağlayın.
Tom Stickel

@Xeltor, sadece bakıyor ve görünüşe göre cevabınız -2 ve BOLD'da YANLIŞ olduğunuzu söyleyen insanlarla yorumlarla dolu.
Tom Stickel

3

isteğe bağlı zincirleme

İsteğe bağlı zincirleme teklifi 4. aşamaya ulaştığından ve daha geniş destek aldığından, bunu yapmanın çok zarif bir yolu var

if(image_array?.length){

  // image_array is defined and has at least one element

}

2

Bu konuda Javascript'te oldukça fazla karşılaşıyorum. Benim için bunu yapmanın en iyi yolu, uzunluğu kontrol etmeden önce çok geniş bir kontrol yapmaktır. Bu soru-cevap bölümünde başka çözümler gördüm, ancak yanlış değeri nullya undefinedda herhangi bir yanlış değeri kontrol etmek istedim .

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

Bu, ilk kontrol edecektir undefined, nullya da diğer yanlış değerler. Bunlardan herhangi biri doğruysa, bu bir boole'yi tamamlayacaktır OR. Daha sonra, array.lengthdizi tanımsızsa bize hata verebilecek daha riskli kontroller kontrol edilebilir. Bu ulaşılabilir asla arraydeğildir undefinedveya nulldurumların sipariş çok önemlidir, bu yüzden.



1

Aşağıdakiler, nesne kapsamı ve işleve iletilen tüm olası veri türleri ile ilgili birkaç sorunu yönetmek için hatalar atan bir işleve sarılmış çözümümdür.

İşte bu sorunu incelemek için kullanılan kemanım ( kaynak )

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);
}

0

Dizi olarak bildirilen bir değişkeniniz yoksa bir denetim oluşturabilirsiniz:

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

Bu, x değişkeni olup olmadığını ve doldurulmuş bir dizi olup olmadığını kontrol eder. aksi takdirde boş bir dizi oluşturur (ya da başka şeyler yapabilirsiniz);

Eğer varsa bazı oluşturulan bir dizi değişkeni basit çek var orada:

var x = [];

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

Diziyi kontrol etmenin en olası yollarını gösteren kemanımı burada kontrol edebilirsiniz .


0

Bunu yapmalısın

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

0

Bu basit kod işe yarayacağını düşünüyorum:

if(!(image_array<=0)){
//Specify function needed
}

-1

ts olarak

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

html'de

(fotoğraflar == tanımsız ||! (isArray (fotoğraflar) && photos.length> 0))


3
Bundan emin misin? İkinci bölüm, sonuçta HTML gibi görünmüyor
Nico Haase

-3

İmage_array öğenizi oluşturduğunuzda boştur, bu nedenle image_array.length öğeniz 0 olur

Aşağıdaki yorumda belirtildiği gibi, cevabımı bu sorunun cevabına göre düzenliyorum ):

var image_array = []

diğer köşeli parantezler içinde kodda daha önce tanımlanan image_array ile hiçbir şey değişmez


Sayfayı yüklerken kaynağımda var ... Sadece göndermeyi unutma.
user1564141

Cevabıma yanlış olabilecek bir şey eklemek istiyorum, bu yüzden burada belirtiyorum. Genel dillerde, bir blok içinde oluşturulanlar bloğun "dışında" görünmez. Diğer []var image_array = []bloğun içinde tanımladığınız gibi , dışarıda görülebileceğinden emin değilim. Deneyinimage_array = []
Al_th

ama image_array'ı başka bir yerden kaldırırsam her şey gayet iyi çalışır.
user1564141
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.