Überprüfen Sie, ob das Array leer oder null ist


106

Ich möchte wissen, wie man prüft, ob ein Array in jQuery leer oder null ist. Ich habe es versucht, array.length === 0aber es hat nicht funktioniert. Es wurde auch kein Fehler ausgegeben.

Dies ist der Code:

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
}

2
Genauso wie in "normalem JavaScript": stackoverflow.com/questions/2672380/…
Julien Schmidt

1
@ Julien, ich habe alle in diesem Thread aufgelisteten Lösungen ausprobiert, bevor ich diesen Thread gestartet habe. Keiner von ihnen hat irgendwie funktioniert.
Eingabe

Können wir mehr Code für den Kontext bekommen? Um JavaScript, HTML? Sind Sie sicher, dass $("input[name='album_text[]']")tatsächlich Elemente zurückgegeben werden?
Jon Adams

@ JulienSchmidt: Bei der von Ihnen verknüpften Frage geht es darum, zu überprüfen, ob ein Array- Wert leer ist, nicht das gesamte Array.
Dan Dascalescu

Antworten:


168

Solange Ihr Selektor tatsächlich funktioniert, sehe ich nichts Falsches an Ihrem Code, der die Länge des Arrays überprüft. Das sollte machen was du willst. Es gibt viele Möglichkeiten, Ihren Code zu bereinigen, um einfacher und besser lesbar zu sein. Hier ist eine bereinigte Version mit Notizen darüber, was ich aufgeräumt habe.

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
}

Einige Notizen darüber, was Sie getan haben und was ich geändert habe.

  1. $(this)ist immer ein gültiges jQuery-Objekt, daher gibt es keinen Grund, dies jemals zu überprüfen if ($(this)). Es enthält möglicherweise keine DOM-Objekte, aber Sie können dies bei $(this).lengthBedarf überprüfen. Dies ist hier jedoch nicht erforderlich, da die .each()Schleife nicht ausgeführt werden würde, wenn keine Elemente vorhanden wären. In $(this)Ihrer .each()Schleife befindet sich also immer etwas.
  2. Es ist ineffizient, $ (this) mehrmals in derselben Funktion zu verwenden. Es ist viel besser, es einmal in eine lokale Variable zu bekommen und es dann von dieser lokalen Variablen aus zu verwenden.
  3. Es wird empfohlen, Arrays mit []anstatt zu initialisieren new Array().
  4. if (value)Wenn erwartet wird, dass der Wert eine Zeichenfolge ist, wird beides geschützt value == null, value == undefinedund value == ""Sie müssen dies nicht tun if (value && (value != "")). Sie können einfach tun:if (value) Überprüfen Sie alle drei leeren Bedingungen.
  5. if (album_text.length === 0) wird Ihnen sagen, ob das Array leer ist, solange es sich um ein gültiges, initialisiertes Array handelt (das es hier ist).

Was versuchst du mit diesem Selektor zu machen $("input[name='album_text[]']")?


5
@MaciekSemik - siehe stackoverflow.com/questions/359494/… . Ich verwende immer die strikte Gleichheit ( ===), es sei denn, ich möchte ausdrücklich eine Typkonvertierung zulassen. Es ist eine gute Angewohnheit, sich darauf einzulassen.
jfriend00

73

Benutzer JQuery ist EmptyObject, um zu ü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

2
Viel zuverlässiger als das Überprüfen der Länge, insbesondere wenn Ihre Variable auch ein Objekt sein kann (bei Objekten funktioniert die Länge nicht, um zu überprüfen, ob sie leer ist).
gaborous

Dies ist meiner Meinung nach die passendere Antwort.
Earl3s

4
isEmptyObjectGibt immer zurück, falsewenn Array.prototypees erweitert ist, z. B. Array.prototype.someFunction = function () {};- auch wenn das Array leer ist. Beachten Sie, dass einige Frameworks (z. B. Ember.js) den Array-Prototyp standardmäßig erweitern.
Jesenko

4
Seien Sie vorsichtig mit isEmptyObject! Für jQuery 1.8.3 wird jQuery.isEmptyObject([])zurückgegeben false, für jQuery 1.11.3 wird jedoch zurückgegeben true. Eigentlich jQuery-Dokumentation heißt es, dass das Argument immer ein einfaches JavaScript-Objekt sein sollte, da andere Objekttypen (DOM-Elemente, primitive Zeichenfolgen / Zahlen, Hostobjekte) möglicherweise keine konsistenten Ergebnisse für alle Browser liefern. Entschuldigung, ich habe die Antwort von @rhinoxi nicht gesehen.
Dmitry Vershinin

8

Sie sollten nach ''(leere Zeichenfolge) suchen, bevor Sie in Ihr Array pushen. Ihr Array enthält Elemente, die leere Zeichenfolgen sind. Dann wird dein album_text.length === 0Wille gut funktionieren.


Bitte beachten Sie den aktualisierten Code. Ich habe diesen Code hinzugefügt, if( $(this).val() && $(this).val() != '') aber er funktioniert nicht.
Eingabe

8

Ich denke, es ist gefährlich, $ .isEmptyObject von jquery zu verwenden, um zu überprüfen, ob das Array leer ist, wie @jesenko erwähnte. Ich habe gerade dieses Problem getroffen.

Im isEmptyObject-Dokument wird Folgendes erwähnt:

Das Argument sollte immer ein einfaches JavaScript-Objekt sein

was Sie durch bestimmen können $.isPlainObject. Die Rückgabe von $.isPlainObject([])ist falsch.

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.