Überprüfen Sie, ob ein Array leer ist oder vorhanden ist


358

Wenn die Seite zum ersten Mal image_arraygeladen wird , muss ich überprüfen, ob ein Bild vorhanden ist, und das letzte Bild laden.

Andernfalls deaktiviere ich die Vorschau-Schaltflächen, warne den Benutzer, die Schaltfläche für neue Bilder zu drücken, und erstelle ein leeres Array, um die Bilder zu platzieren.

Das Problem ist, dass image_arrayin den elseBränden die ganze Zeit. Wenn ein Array vorhanden ist, wird es nur überschrieben, aber die Warnung funktioniert nicht.

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

UPDATE Vor dem Laden von HTML habe ich ungefähr Folgendes:

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

Konsolenprotokoll image_array- was bekommen Sie?
Utkanos

@Utkanos wenn es var image_array = [] gibt - undefiniert wenn // var image_array = [] (kommentiert) - reales Array.
user1564141

Array? .Länge - weit verbreitet und wird bald ein natives Feature sein
Anbu Agarwal

Antworten:


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

Ihr Problem kann aufgrund einer Mischung aus impliziten globalen Variablen und variablem Heben auftreten. Stellen Sie sicher, dass Sie beim varDeklarieren einer Variablen Folgendes verwenden:

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

Und stellen Sie dann sicher, dass Sie diese Variable später nie versehentlich neu deklarieren:

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

33
Nee. Dies wird ausgelöst, wenn image_array null ist. Murphys Gesetz besagt, dass es eines Tages so sein wird.
Marco Faustinelli

7
Ist das nicht image_array.lengthgenug (ohne Angabe >0)
Mcont

Neugierig: Können Sie mit der Antwort von @JamesDrinkard einen Anwendungsfall finden, der nicht funktioniert?
Tsemer

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

195

Um zu überprüfen, ob ein Array leer ist oder nicht

Ein moderner Weg, ES5 +:

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

Ein Weg der alten Schule:

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

Ein kompakter Weg:

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

Ein CoffeeScript-Weg:

if array?.length > 0

Warum?

Fall undefiniert
Undefinierte Variable ist eine Variable, der Sie noch nichts zugewiesen haben.

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

Fall Null Im
Allgemeinen ist Null der Zustand, in dem ein Wert fehlt. Beispielsweise ist eine Variable null, wenn Sie einige Daten verpasst oder nicht abgerufen haben.

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

Fall Kein Array
Javascript hat ein dynamisches Typsystem. Dies bedeutet, dass wir nicht garantieren können, welchen Objekttyp eine Variable enthält. Es besteht die Möglichkeit, dass wir nicht mit einer Instanz von sprechen Array.

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

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

Case Empty Array
Da wir nun alle anderen Möglichkeiten getestet haben, sprechen wir mit einer Instanz von Array. Um sicherzustellen, dass es nicht leer ist, fragen wir nach der Anzahl der Elemente, die es enthält, und stellen sicher, dass es mehr als null Elemente enthält.

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

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

8
Bitte beachten Sie, dass es nicht ausreicht, nur nachzuschauen, (typeof array != "undefined" && array.length > 0)denn wenn arraynull ist, erhalten wir TypeError: Cannot read property 'length' of null.
Pooyan Khosravi

Vielleicht ändere && mit ||
Sahar Ch.

!(typeof array !== "undefined") || !(array.length > 0)? Habe es gerade versucht, habe den gleichen Fehler bekommen. Können Sie uns ein vollständiges Beispiel für die Verwendung geben ||?
Pooyan Khosravi

Ich meinte(typeof array != "undefined" || array.length > 0)
Sahar Ch.

Danke für die Klarstellung. (typeof array != "undefined" || array.length > 0)gibt trueif zurück array = null. !(typeof array != "undefined" || array.length > 0)gibt falseif zurück array = [1,2]. Entschuldigung für das Unverständnis, aber @Elsa können Sie ein funktionierendes Beispiel liefern? Danke im Voraus.
Pooyan Khosravi

70

Wie wäre es mit (ECMA 5.1):

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

1
Re .. && image_array.length). IMHO, während Sie sich sicher auf die lose Eingabe von JS verlassen können , um eine 0Ganzzahl in falseund eine non-zeroGanzzahl in umzuwandeln true, halte ich es aus Gründen der Lesbarkeit in Zukunft für vorzuziehen, "zu sagen, was Sie meinen". Ich würde es tun .. && image_array.length > 0).
ToolmakerSteve

28

Das benutze ich. Die erste Bedingung betrifft die Wahrheit, die sowohl null als auch undefiniert ist. Die zweite Bedingung prüft auf ein leeres Array.

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

oder dank tsemers kommentar habe ich eine zweite version hinzugefügt

if(arrayName && arrayName.length)

Dann habe ich mit Scratchpad in Firefox einen Test für die zweite Bedingung durchgeführt:

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

das beweist auch das if(array2 && array2.length)und macht if(array2 && array2.length > 0)genau das gleiche


13
Ich finde das am prägnantesten und decke alle Ausnahmeprobleme ab. Und da Sie if (arrayName && arrayName.length)
Wahrhaftigkeit

2
Kurz und schnell! Ich habe eine Weile gebraucht, um mich an if (obj) zu gewöhnen, um nach null zu suchen, aber jetzt liebe ich es: if (obj) // null check; if (array && array.length) // Array null oder leer check; if (array &&! array.length) // array existiert, aber leer check; if (str) // string nicht null und nicht leer. Das einzige Problem ist, dass keine Zahlen verwendet werden, wenn Null eine gültige Zahl ist.
Rick Love

1
Ich benutze (arrayName && arrayName.length) für eine Weile, dann habe ich mir Sorgen gemacht, ob etwas daran falsch sein könnte. Diese Antwort hat mich getröstet, danke :)
Koray

In Typescript gibt es Nuancen, da der var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0Typ für isNotEmpty nicht boolesch, sondern boolesch | undefiniert wäre.
Giedrius

15

Du solltest benutzen:

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

8

Wenn Sie testen möchten, ob die Image-Array-Variable definiert wurde, können Sie dies folgendermaßen tun

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 schwer zu sagen, wo die Funktion relativ zu Ihrem gesetzten image_array deklariert wird. Möglicherweise liegt ein Hosting-Problem vor, daher müssen Sie diese Variable möglicherweise als var index_array = ... deklarieren. Außerdem wird das Skript-Tag, für das Sie index_array festlegen, geschlossen. Aus dem Screenshot geht dies nicht hervor.
Mike Brant

In der anderen ist auch Alarm, der nur ausgelöst wird, wenn das Array leer ist, aber die var image_array funktioniert jedes Mal ... Ich kann nicht verstehen, warum?
user1564141

@ user1564141 Es wäre hilfreich, wenn Sie Ihre Frage aktualisieren könnten, um die Quelle als Ausgabe anzuzeigen. Ich habe immer noch kein Gefühl dafür, wo sich Ihre if-else-Logik in der Quelle relativ zum Speicherort Ihrer index_array-Deklaration befindet.
Mike Brant

6

JavaScript

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

Lodash & Unterstrich

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

6

Mit jQuery's können Sie isEmptyObject()überprüfen, ob das Array Elemente enthält oder nicht.

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

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


Dies ist das einzige, was für mich beim Hinzufügen von Elementen mit array.push () funktioniert hat - aus dynamisch hinzugefügten Elementen (ajax). Vielen Dank
TomoMiha

3

Ein einfacher Weg, der keine Ausnahmen zur Folge hat, wenn er nicht existiert und in einen Booleschen Wert konvertiert wird:

!!array

Beispiel:

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

3

Wie wäre es damit ? Das Überprüfen der Länge eines undefinierten Arrays kann eine Ausnahme auslösen.

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

Die Verschachtelung ifkann vermieden werden &&, indem wie in image_array && image_array.length, es wird kurzgeschlossen, wenn image_arraynicht vorhanden.
Rvazquezglez

3

Für mich "funktionieren" sicher einige der hoch bewerteten Antworten, wenn ich sie in jsfiddle einfüge, aber wenn ich eine dynamisch generierte Menge an Array-Listen habe, funktioniert ein Großteil dieses Codes in den Antworten einfach nicht für MICH.

Das ist es, was für mich funktioniert.

var from = [];

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

Beachten Sie, dass KEINE Anführungszeichen undefiniert sind und ich mich nicht um die Länge kümmere.


1
zwei Kommentare: 1) typeofgibt einen String zurück, der Vergleich mit undefinedwird immer flasy sein 2) Sie überprüfen nicht, ob fromdefiniert ist. Ihr Code oben wird einen Fehler
auslösen,

@ Xeltor Nein, wird es nicht. Bitte geben Sie Ihre jsfiddle oder Ihren Plunker an, um dies zu beweisen oder Ihren Kommentar zu entfernen.
Tom Stickel

@ Xeltor, ich schaue nur und es scheint, dass Ihre Antwort -2 hat und voller Kommentare mit Leuten, die in Fettdruck sagen, dass Sie FALSCH sind.
Tom Stickel

3

optionale Verkettung

Da der optionale Verkettungsvorschlag Stufe 4 erreicht hat und eine breitere Unterstützung erhält, gibt es eine sehr elegante Möglichkeit, dies zu tun

if(image_array?.length){

  // image_array is defined and has at least one element

}

2

Ich stoße in Javascript ziemlich oft auf dieses Problem. Für mich ist der beste Weg, dies zu tun, eine sehr breite Prüfung durchzuführen, bevor die Länge überprüft wird. Ich sah einige andere Lösungen in diesem Q & A, aber ich wollte entweder überprüfen können , nulloder undefinedoder anderen falschen Wert.

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

Dies wird zunächst prüfen undefined, nulloder andere falsche Werte. Wenn einer dieser Punkte zutrifft, wird der Boolesche Wert vervollständigt, da dies ein ist OR. Dann kann die riskantere Überprüfung überprüft werden array.length, die uns Fehler machen kann, wenn das Array nicht definiert ist. Das wird nie erreicht werden , wenn arrayist undefinedoder null, so die Reihenfolge der Bedingungen sehr wichtig ist.



1

Das Folgende ist meine Lösung, die in eine Funktion eingebunden ist, die auch Fehler auslöst, um einige Probleme mit dem Objektbereich und allen Arten möglicher Datentypen zu verwalten, die an die Funktion übergeben werden.

Hier ist meine Geige, mit der dieses Problem untersucht wurde ( Quelle )

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

Wenn Sie keine Variable als Array deklariert haben, können Sie eine Prüfung erstellen:

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

Dies prüft, ob die Variable x existiert und ob es sich um ein gefülltes Array handelt. Andernfalls wird ein leeres Array erstellt (oder Sie können andere Aufgaben ausführen).

Wenn Sie sicher sind , dass eine Array-Variable erstellt wurde, gibt es eine einfache Überprüfung:

var x = [];

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

Sie können meine Geige hier mit den meisten Möglichkeiten überprüfen, um das Array zu überprüfen.


0

Du solltest das tun

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

0

Ich denke, dieser einfache Code würde funktionieren:

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

-1

in ts

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

in html

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


3
Bist du dir da sicher? Der zweite Teil sieht doch nicht wie HTML aus
Nico Haase

-3

Wenn Sie Ihr image_array erstellen, ist es leer, daher ist Ihre image_array.length 0

Wie im Kommentar unten angegeben, bearbeite ich meine Antwort basierend auf der Antwort dieser Frage :

var image_array = []

In den else-Klammern ändert sich nichts an dem zuvor im Code definierten image_array


Ich habe es in der Quelle, beim Laden der Seite ... Vergiss einfach zu posten.
user1564141

Ich möchte meiner Antwort etwas hinzufügen, das möglicherweise falsch ist, also sage ich es hier. In gängigen Sprachen ist das, was innerhalb eines Blocks erstellt wird, "außerhalb" des Blocks nicht sichtbar. Wie Sie []var image_array = []innerhalb des else-Blocks definieren, bin ich mir nicht sicher, ob er draußen zu sehen ist. Versuchen Sieimage_array = []
Al_th

aber wenn ich image_array aus dem else entferne, funktioniert alles einwandfrei.
user1564141
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.