Vérifiez si le tableau est vide ou nul

107

Je voudrais savoir comment vérifier si un tableau est vide ou nul dans jQuery. J'ai essayé array.length === 0mais ça n'a pas marché. Il n'a jeté aucune erreur non plus.

Voici le 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
}
contribution
la source
2
De la même manière qu'en "JavaScript normal": stackoverflow.com/questions/2672380/…
Julien Schmidt
1
@Julien, j'ai essayé toutes ces solutions répertoriées dans ce fil avant de commencer ce fil. Aucun d'eux n'a fonctionné d'une manière ou d'une autre.
entrée
Pouvons-nous obtenir plus de code pour le contexte? Entourant JavaScript, HTML? Êtes-vous sûr que cela $("input[name='album_text[]']")renvoie réellement des éléments?
Jon Adams
@JulienSchmidt: la question à laquelle vous avez lié est de vérifier si une valeur de tableau est vide, pas le tableau entier.
Dan Dascalescu

Réponses:

168

Tant que votre sélecteur fonctionne réellement, je ne vois rien de mal avec votre code qui vérifie la longueur du tableau. Cela devrait faire ce que vous voulez. Il existe de nombreuses façons de nettoyer votre code pour être plus simple et plus lisible. Voici une version nettoyée avec des notes sur ce que j'ai nettoyé.

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
}

Quelques notes sur ce que vous faisiez et ce que j'ai changé.

  1. $(this)est toujours un objet jQuery valide, il n'y a donc aucune raison de vérifier if ($(this)). Il ne contient peut-être aucun objet DOM, mais vous pouvez le vérifier avec $(this).lengthsi vous en avez besoin, mais ce n'est pas nécessaire ici car la .each()boucle ne fonctionnerait pas s'il n'y avait pas d'éléments, donc à l' $(this)intérieur de votre .each()boucle sera toujours quelque chose.
  2. Il est inefficace d'utiliser $ (this) plusieurs fois dans la même fonction. Il est préférable de l'introduire une fois dans une variable locale et de l'utiliser ensuite à partir de cette variable locale.
  3. Il est recommandé d'initialiser les tableaux avec []plutôt que new Array().
  4. if (value)quand on s'attend à ce que la valeur soit une chaîne, elle protégera à la fois value == null, value == undefinedet value == ""vous n'avez donc pas à le faire if (value && (value != "")). Vous pouvez simplement faire: if (value)vérifier les trois conditions vides.
  5. if (album_text.length === 0) vous dira si le tableau est vide tant qu'il s'agit d'un tableau valide et initialisé (ce qu'il est ici).

Qu'essayez-vous de faire avec ce sélecteur $("input[name='album_text[]']")?

jfriend00
la source
5
@MaciekSemik - voir stackoverflow.com/questions/359494/… . J'utilise toujours l'égalité stricte ( ===) sauf si je souhaite spécifiquement autoriser une conversion de type. C'est une bonne habitude à prendre.
jfriend00
73

L'utilisateur JQuery est EmptyObject pour vérifier si le tableau contient des éléments ou non.

var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true
Mayank Raipure
la source
2
Beaucoup plus fiable que de vérifier la longueur, surtout si votre variable peut aussi être un objet (avec des objets, la longueur ne fonctionne pas pour vérifier si elle est vide).
gaborous
C'est la réponse la plus appropriée à mon avis.
earl3s
4
isEmptyObjectrenvoie toujours falsesi Array.prototypeest étendu, par exemple Array.prototype.someFunction = function () {};- même si le tableau est vide. Notez que certains frameworks (par exemple Ember.js) étendent le prototype Array par défaut.
jesenko
4
Soyez prudent avec isEmptyObject! Pour jQuery 1.8.3 jQuery.isEmptyObject([])renvoie false, mais pour jQuery 1.11.3 il retourne true. En fait, la documentation de jQuery indique que l'argument doit toujours être un objet JavaScript simple car d'autres types d'objet (éléments DOM, chaînes / nombres primitifs, objets hôtes) peuvent ne pas donner des résultats cohérents entre les navigateurs. Désolé, je n'ai pas vu la réponse de @rhinoxi.
Dmitry Vershinin
8

Vous devriez vérifier ''(chaîne vide) avant de pousser dans votre tableau. Votre tableau contient des éléments qui sont des chaînes vides. Ensuite, votre album_text.length === 0volonté fonctionnera très bien.

Daniel A. White
la source
Veuillez consulter le code mis à jour. J'ai ajouté ce code if( $(this).val() && $(this).val() != '') mais cela ne fonctionne pas.
entrée
8

Je pense qu'il est dangereux d'utiliser $ .isEmptyObject de jquery pour vérifier si le tableau est vide, comme @jesenko l'a mentionné. Je viens de rencontrer ce problème.

Dans le document isEmptyObject , il mentionne:

L'argument doit toujours être un simple objet JavaScript

que vous pouvez déterminer par $.isPlainObject. Le retour de $.isPlainObject([])est faux.

rhinoxi
la source