Controlla se l'array è vuoto o nullo


106

Vorrei sapere come verificare se un array è vuoto o nullo in jQuery. Provaiarray.length === 0 ma non ha funzionato. Non ha nemmeno generato alcun errore.

Questo è il codice:

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
Allo stesso modo del "JavaScript normale": stackoverflow.com/questions/2672380/…
Julien Schmidt

1
@ Julien, ho provato tutte le soluzioni elencate in quel thread prima di iniziare questo thread. Nessuno di loro ha funzionato in qualche modo.
ingresso

Possiamo ottenere altro codice per il contesto? JavaScript, HTML circostante? Sei sicuro che $("input[name='album_text[]']")stia effettivamente restituendo elementi?
Jon Adams

@JulienSchmidt: la domanda a cui ti sei collegato riguarda il controllo se il valore di un array è vuoto, non l'intero array.
Dan Dascalescu

Risposte:


168

Finché il tuo selettore funziona effettivamente, non vedo nulla di sbagliato nel tuo codice che controlla la lunghezza dell'array. Dovrebbe fare quello che vuoi. Esistono molti modi per ripulire il codice in modo che sia più semplice e leggibile. Ecco una versione pulita con note su ciò che ho ripulito.

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
}

Alcuni appunti su quello che stavi facendo e su cosa ho cambiato.

  1. $(this)è sempre un oggetto jQuery valido quindi non c'è motivo di controllarlo if ($(this)). Potrebbe non avere alcun oggetto DOM al suo interno, ma puoi verificarlo con $(this).lengthse necessario, ma non è necessario qui perché il .each()ciclo non verrebbe eseguito se non ci fossero elementi $(this)all'interno del tuo.each() ciclo ci sarà sempre qualcosa.
  2. È inefficiente utilizzare $ (this) più volte nella stessa funzione. Molto meglio inserirlo una volta in una variabile locale e poi usarlo da quella variabile locale.
  3. Si consiglia di inizializzare gli array con []invece di new Array().
  4. if (value)quando il valore dovrebbe essere una stringa proteggerà entrambi value == null, value == undefinede value == ""quindi non devi farlo if (value && (value != "")). Puoi semplicemente fare:if (value) controllare tutte e tre le condizioni di vuoto.
  5. if (album_text.length === 0) ti dirà se l'array è vuoto fintanto che è un array inizializzato valido (che è qui).

Cosa stai cercando di fare con questo selettore $("input[name='album_text[]']")?


5
@MaciekSemik - vedi stackoverflow.com/questions/359494/... . Uso sempre l'uguaglianza rigorosa ( ===) a meno che non voglia specificamente consentire una conversione del tipo. È una buona abitudine entrare.
jfriend00

73

L'utente JQuery è EmptyObject per verificare se l'array contiene elementi o meno.

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

2
Molto più affidabile che controllare la lunghezza, specialmente se la tua variabile può anche essere un oggetto (con oggetti, la lunghezza non funziona per controllare se è vuota).
gaborous

Questa è la risposta più appropriata secondo me.
Earl3s

4
isEmptyObjectrestituisce sempre falsese Array.prototypeè esteso, ad esempio Array.prototype.someFunction = function () {};- anche se l'array è vuoto. Si noti che alcuni framework (ad esempio Ember.js) estendono il prototipo Array per impostazione predefinita.
jesenko

4
Fai attenzione isEmptyObject! Per i jQuery.isEmptyObject([])ritorni di jQuery 1.8.3 false, ma per jQuery 1.11.3 ritorna true. In realtà, la documentazione di jQuery dice che l'argomento dovrebbe sempre essere un semplice oggetto JavaScript poiché altri tipi di oggetto (elementi DOM, stringhe / numeri primitivi, oggetti host) potrebbero non fornire risultati coerenti tra i browser. Spiacenti, non ho visto la risposta di @rhinoxi.
Dmitry Vershinin

8

Dovresti controllare ''(stringa vuota) prima di inserire il tuo array. Il tuo array ha elementi che sono stringhe vuote. Allora il tuo album_text.length === 0funzionerà bene.


Si prega di consultare il codice aggiornato. Ho aggiunto questo codice if( $(this).val() && $(this).val() != '') ma non funziona.
ingresso

8

Penso che sia pericoloso usare $ .isEmptyObject da jquery per verificare se l'array è vuoto, come menzionato da @jesenko. Ho appena incontrato quel problema.

Nel documento isEmptyObject , menziona:

L'argomento dovrebbe sempre essere un semplice oggetto JavaScript

che puoi determinare in base a $.isPlainObject. Il ritorno di $.isPlainObject([])è falso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.