Sprawdź, czy tablica jest pusta lub istnieje

358

Gdy strona ładuje się po raz pierwszy, muszę sprawdzić, czy jest tam obraz image_arrayi załadować ostatni obraz.

W przeciwnym razie wyłączam przyciski podglądu, ostrzegam użytkownika, aby nacisnął nowy przycisk obrazu i utworzyłem pustą tablicę, aby umieścić obrazy;

Problem polega na tym, że image_arrayw elsepożarach cały czas. Jeśli tablica istnieje - po prostu ją zastępuje, ale alert nie działa.

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

AKTUALIZACJA Przed załadowaniem html mam coś takiego:

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>
użytkownik1564141
źródło
Dziennik konsoli image_array- co otrzymujesz?
Utkanos
@Utkanos, jeśli istnieje var image_array = [] - niezdefiniowany, jeśli // var image_array = [] (komentowany) - prawdziwa tablica.
user1564141
array? .length - szeroko wspierany i wkrótce będzie natywną funkcją
Anbu Agarwal

Odpowiedzi:

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

Twój problem może występować z powodu połączenia niejawnych zmiennych globalnych i podnoszenia zmiennych. Upewnij się, że używasz varza każdym razem, gdy deklarujesz zmienną:

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

A potem upewnij się, że nigdy później przypadkowo nie zmienisz tej zmiennej:

else {
    ...
    image_array = []; // no var here
}
jbabey
źródło
33
Nie. To wybuchnie, gdy image_array ma wartość NULL. Prawo Murphy'ego stwierdza, że ​​kiedyś to nastąpi.
Marco Faustinelli
7
Nie image_array.lengthwystarczy (bez wyszczególnienia >0)
mct
Ciekawe: czy możesz znaleźć jakiś przypadek użycia, który złamałby się przy użyciu odpowiedzi @JamesDrinkard?
tsemer
11
if (image_array && image_array.length){ // array exists and has elements
YeeHaw1234
195

Aby sprawdzić, czy tablica jest pusta, czy nie

Nowoczesny sposób, ES5 +:

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

Oldschoolowy sposób:

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

Kompaktowy sposób:

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

Sposób na CoffeeScript:

if array?.length > 0

Dlaczego?

Case Undefined
Niezdefiniowana zmienna to zmienna, do której jeszcze jej nie przypisałeś.

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

Przypadek Null
Ogólnie mówiąc, null to stan braku wartości. Na przykład zmienna ma wartość NULL, gdy niektóre dane zostały pominięte lub nie powiodło się.

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

Case Not an Array
JavaScript ma dynamiczny system typów. Oznacza to, że nie możemy zagwarantować, jaki typ obiektu posiada zmienna. Istnieje szansa, że ​​nie rozmawiamy z żadnym przypadkiem Array.

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

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

Case Empty Array
Teraz, odkąd przetestowaliśmy wszystkie inne możliwości, rozmawiamy o instancji Array. Aby upewnić się, że nie jest pusty, pytamy o liczbę elementów, które zawiera i upewniając się, że ma więcej niż zero elementów.

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

secondArray = [1,2,3];
secondArray.length > 0; // => true
Pooyan Khosravi
źródło
8
Pamiętaj, że nie wystarczy po prostu sprawdzić, (typeof array != "undefined" && array.length > 0)ponieważ jeśli arrayjest zerowy, dostaniemy TypeError: Cannot read property 'length' of null.
Pooyan Khosravi
Może zmień && za pomocą ||
Sahar Ch.
!(typeof array !== "undefined") || !(array.length > 0)? Po prostu spróbowałem, dostałem ten sam błąd. Czy możesz podać nam pełny przykład korzystania ||?
Pooyan Khosravi
Miałem na myśli(typeof array != "undefined" || array.length > 0)
Sahar Ch.
Dzięki za wyjaśnienie. (typeof array != "undefined" || array.length > 0)zwraca truejeśli array = null. !(typeof array != "undefined" || array.length > 0)zwraca falsejeśli array = [1,2]. Przepraszamy za brak zrozumienia, ale @Elsa możesz podać działający przykład? Z góry dziękuję.
Pooyan Khosravi
70

Co powiesz na (ECMA 5.1):

if(Array.isArray(image_array) && image_array.length){
  // array exists and is not empty
}
Queequeg
źródło
1
Re .. && image_array.length). IMHO, podczas gdy można bezpiecznie polegać na luźne wpisywanie JS jest, aby przekonwertować 0liczbę całkowitą falsei non-zeroliczbę całkowitą true, uważam to korzystne, dla czytelności w przyszłości, aby „powiedzieć, co masz na myśli”. Zrobiłbym .. && image_array.length > 0).
ToolmakerSteve,
28

Tego używam. Pierwszy warunek obejmuje prawdę, która ma zarówno wartość zerową, jak i niezdefiniowaną. Drugi warunek sprawdza pustą tablicę.

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

lub dzięki komentarzowi tsemera dodałem drugą wersję

if(arrayName && arrayName.length)

Następnie wykonałem test dla drugiego warunku, używając Scratchpad w 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!");
}

co również to potwierdza if(array2 && array2.length)i if(array2 && array2.length > 0)robią dokładnie to samo

James Drinkard
źródło
13
Uważam, że jest to najbardziej zwięzłe i obejmuje wszystkie problemy wyjątków. A ponieważ lubisz prawdę, możesz nawet if (arrayName && arrayName.length)
zadowolić się
2
Krótko i szybko! Zajęło mi trochę czasu, przychodząc z C #, aby przyzwyczaić się do if (obj), aby sprawdzić, czy jest pusta, ale teraz to uwielbiam: if (obj) // null check; if (array && array.length) // tablica zerowa lub pusta kontrola; if (tablica &&! array.length) // tablica istnieje, ale puste pole wyboru; if (str) // ciąg nie jest pusty i nie jest pusty. Jedyną gotcha nie należy używać na liczbach, jeśli zero jest poprawną liczbą.
Rick Love
1
Przez jakiś czas używałem (arrayName && arrayName.length), a potem zacząłem się martwić, czy coś może być nie tak. Ta odpowiedź mnie pocieszyła, dzięki :)
Koray
W maszynopisie są niuanse, ponieważ dla var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0typu dla isNotEmpty nie byłby boolowski, to byłby boolean | niezdefiniowany.
Giedrius
15

Powinieneś użyć:

  if (image_array !== undefined && image_array.length > 0)
Samson
źródło
8

Jeśli chcesz sprawdzić, czy zmienna tablicy obrazów została zdefiniowana, możesz to zrobić w ten sposób

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
źródło
Nie działa dl.dropbox.com/u/14396564/screens/…
user1564141
@ user1564141 trudno powiedzieć, gdzie funkcja jest zadeklarowana w stosunku do ustawionego image_array. Być może masz problem z hostingiem, więc może być konieczne zadeklarowanie tej zmiennej jako var index_array = ... Ponadto jest to tag skryptu, w którym ustawiasz zamknięcie tablicy indeksów. Nie wygląda tak na zrzucie ekranu.
Mike Brant
W innym przypadku jest także alert, który uruchamia się tylko, gdy tablica jest pusta, ale var image_array działa za każdym razem ... Nie mogę zrozumieć, dlaczego?
user1564141,
@ user1564141 Byłoby pomocne, gdybyś mógł zaktualizować swoje pytanie, aby pokazać źródło jako wynik. Nadal nie mam pojęcia, gdzie znajduje się logika if-else w źródle w stosunku do położenia deklaracji index_array.
Mike Brant
6

JavaScript

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

Lodash i podkreślenie

( _.isArray(myArray) && myArray.length > 0 )
Amit Bhagat
źródło
6

Za pomocą jQuery isEmptyObject()można sprawdzić, czy tablica zawiera elementy, czy nie.

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

Źródło: https://api.jquery.com/jQuery.isEmptyObject/

Mayank Raipure
źródło
Jest to jedyna rzecz, która działała dla mnie podczas dodawania elementów za pomocą array.push () - z dynamicznie dodawanych elementów (ajax). Dzięki
TomoMiha,
3

Prosty sposób, który nie powoduje wyjątków, jeśli nie istnieje, i konwersję na wartość logiczną:

!!array

Przykład:

if (!!arr) {
  // array exists
}
insygnia
źródło
3

Co powiesz na to ? sprawdzenie długości niezdefiniowanej tablicy może spowodować wyjątek.

if(image_array){
//array exists
    if(image_array.length){
    //array has length greater than zero
    }
}
Nikul Patel
źródło
Zagnieżdżonego ifmożna uniknąć &&, ponieważ w image_array && image_array.lengthprzypadku zwarcia, jeśli image_arraynie istnieje.
rvazquezglez
3

Dla mnie na pewno niektóre z wysoko ocenianych odpowiedzi „działają”, kiedy umieszczam je w jsfiddle, ale kiedy mam dynamicznie generowaną listę tablic, wiele tego kodu w odpowiedziach po prostu nie działa dla MNIE.

To właśnie dla mnie działa.

var from = [];

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

Zauważ, ŻADNE cytaty nie są zdefiniowane i nie przejmuję się długością.

Tom Stickel
źródło
1
dwa komentarze: 1) typeofzwraca ciąg, w porównaniu do undefinedzawsze będzie flasy 2) nie sprawdzasz, czy fromjest zdefiniowany. powyższy kod
wygeneruje
@Xeltor Nie, nie będzie. podaj jsfiddle lub plunker, aby to udowodnić lub usuń komentarz.
Tom Stickel
@ Xeltor, tylko patrzę i wygląda na to, że twoja odpowiedź ma -2, i wypełnione są komentarzami, gdy ludzie mówią w BOLD, że jesteś NIEPRAWIDŁOWY.
Tom Stickel
3

opcjonalne łączenie

Ponieważ opcjonalna propozycja łączenia osiągnęła etap 4 i zyskuje szersze poparcie, istnieje bardzo elegancki sposób, aby to zrobić

if(image_array?.length){

  // image_array is defined and has at least one element

}
LonelyCpp
źródło
2

Często spotykam się z tym problemem w Javascript. Dla mnie najlepszym sposobem na to jest sprawdzenie bardzo szerokiej kratki przed sprawdzeniem długości. Widziałem kilka innych rozwiązań w tym Q & A, ale chciałem być w stanie sprawdzić na obu nulllub undefinedlub jakiejkolwiek innej fałszywej wartości.

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

Będzie to pierwszy sprawdzić undefined, nullczy inne fałszywe wartości. Jeśli którakolwiek z tych prawd jest prawdą, dopełni boolean, ponieważ jest to OR. Następnie można sprawdzić bardziej ryzykowne sprawdzenie array.length, które może nas pomylić, jeśli tablica jest niezdefiniowana. To nigdy nie zostanie osiągnięty, jeśli arrayjest undefinedlub null, więc kolejność warunków jest bardzo ważne.

Jim Factor
źródło
2

Za pomocą undescore lub lodash :

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

Witalij
źródło
1

Poniżej znajduje się moje rozwiązanie opakowane w funkcję, która również generuje błędy w celu zarządzania kilkoma problemami z zakresem obiektu i wszystkimi możliwymi typami danych przekazywanymi do funkcji.

Oto moje skrzypce użyte do zbadania tego problemu ( źródło )

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.
źródło
0

Jeśli nie masz zmiennej zadeklarowanej jako tablica, możesz utworzyć czek:

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

Sprawdza, czy zmienna x istnieje, a jeśli tak, sprawdza, czy jest to wypełniona tablica. w przeciwnym razie tworzy pustą tablicę (lub możesz robić inne rzeczy);

Jeśli masz pewność, że utworzono zmienną tablicową, następuje proste sprawdzenie:

var x = [];

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

Możesz sprawdzić moje skrzypce tutaj, pokazując najbardziej możliwe sposoby sprawdzenia tablicy.

Plippie
źródło
0

Powinieneś to zrobić

    if (!image_array) {
      // image_array defined but not assigned automatically coerces to false
    } else if (!(0 in image_array)) {
      // empty array
      // doSomething
    }
shivam malhotra
źródło
-1

w ts

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

w html

(zdjęcia == undefined ||! (isArray (zdjęcia) && photos.length> 0))

velan
źródło
3
Jesteś pewien? Druga część wcale nie wygląda jak HTML
Nico Haase,
-3

Kiedy tworzysz tablicę obrazków, jest ona pusta, dlatego twoja tablica obrazków ma długość 0

Jak stwierdzono w komentarzu poniżej, edytuję swoją odpowiedź na podstawie odpowiedzi na to pytanie ):

var image_array = []

w nawiasach klamrowych nic nie zmienia na obraz zdefiniowany wcześniej w kodzie

Al_th
źródło
Mam go w źródle, podczas ładowania strony ... Po prostu zapomnij opublikować.
user1564141
Chcę dodać do mojej odpowiedzi coś, co może być złe, więc podaję to tutaj. W popularnych językach to, co powstaje w bloku, nie jest widoczne „poza” blokiem. Gdy definiujesz []var image_array = []wewnątrz bloku else, nie jestem pewien, czy można go zobaczyć na zewnątrz. Spróbujimage_array = []
Al_th
ale jeśli usunę image_array z pozostałych, wszystko działa dobrze.
user1564141,