Vérifiez si un tableau est vide ou existe

358

Lorsque la page se charge pour la première fois, je dois vérifier s'il y a une image dans image_array et charger la dernière image.

Sinon, je désactive les boutons de prévisualisation, alerte l'utilisateur de pousser le nouveau bouton d'image et crée un tableau vide pour mettre les images;

Le problème est que image_arraydans les elseincendies tout le temps. Si un tableau existe - il le remplace simplement, mais l'alerte ne fonctionne pas.

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

MISE À JOUR Avant de charger du HTML, j'ai quelque chose comme ceci:

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>
user1564141
la source
Journal de la console image_array- qu'obtenez-vous?
Utkanos
@Utkanos s'il y a var image_array = [] - non défini si // var image_array = [] (comenté) - vrai tableau.
user1564141
array? .length - largement pris en charge et sera bientôt une fonctionnalité native
Anbu Agarwal

Réponses:

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

Votre problème peut se produire en raison d'un mélange de variables globales implicites et de levage de variables. Assurez-vous d'utiliser varchaque fois que vous déclarez une variable:

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

Et puis assurez-vous de ne jamais redéclarer accidentellement cette variable plus tard:

else {
    ...
    image_array = []; // no var here
}
jbabey
la source
33
Nan. Cela explosera lorsque image_array est nul. La loi de Murphy stipule qu'un jour ce sera le cas.
Marco Faustinelli
7
Ça ne image_array.lengthsuffit pas ? (sans préciser >0)
mcont
Curieux: pouvez-vous trouver un cas d'utilisation qui se briserait en utilisant la réponse de @JamesDrinkard?
tsemer
12
if (image_array && image_array.length){ // array exists and has elements
YeeHaw1234
195

Pour vérifier si un tableau est vide ou non

Une manière moderne, ES5 +:

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

Une façon old-school:

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

Une manière compacte:

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

Une façon CoffeeScript:

if array?.length > 0

Pourquoi?

Case Undefined
Undefined variable est une variable à laquelle vous ne lui avez encore rien attribué.

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

Case Null
D'une manière générale, null est l'état de manque de valeur. Par exemple, une variable est nulle lorsque vous avez manqué ou échoué à récupérer certaines données.

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

Case Not an Array
Javascript a un système de type dynamique. Cela signifie que nous ne pouvons pas garantir quel type d'objet contient une variable. Il est possible que nous ne parlions pas d'une instance de Array.

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

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

Case Empty Array
Maintenant que nous avons testé toutes les autres possibilités, nous parlons d'une instance de Array. Afin de nous assurer qu'il n'est pas vide, nous demandons le nombre d'éléments qu'il contient et nous assurons qu'il contient plus de zéro élément.

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

secondArray = [1,2,3];
secondArray.length > 0; // => true
Pooyan Khosravi
la source
8
Veuillez noter qu'il ne suffit pas de simplement vérifier (typeof array != "undefined" && array.length > 0)car s'il arrayest nul, nous l'obtiendrons TypeError: Cannot read property 'length' of null.
Pooyan Khosravi
Peut-être changer && avec ||
Sahar Ch.
!(typeof array !== "undefined") || !(array.length > 0)? Je viens de l'essayer, j'ai la même erreur. Pouvez-vous nous donner un exemple complet de la façon d'utiliser ||?
Pooyan Khosravi
Je voulais dire(typeof array != "undefined" || array.length > 0)
Sahar Ch.
Merci pour la clarification. (typeof array != "undefined" || array.length > 0)renvoie trueif array = null. !(typeof array != "undefined" || array.length > 0)renvoie falseif array = [1,2]. Désolé de ne pas comprendre, mais @Elsa pouvez-vous fournir un exemple de travail? Merci d'avance.
Pooyan Khosravi
70

Que diriez-vous (ECMA 5.1):

if(Array.isArray(image_array) && image_array.length){
  // array exists and is not empty
}
Queequeg
la source
1
Re .. && image_array.length). À mon humble avis, alors que vous pouvez compter en toute sécurité sur le typage lâche de JS, pour convertir un 0entier en falseet un non-zeroentier en true, je considère préférable, pour plus de lisibilité à l'avenir, de "dire ce que vous voulez dire". Je le ferais .. && image_array.length > 0).
ToolmakerSteve
28

C'est ce que j'utilise. La première condition couvre la vérité, qui est à la fois nulle et non définie. La deuxième condition vérifie la présence d'un tableau vide.

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

ou grâce au commentaire de tsemer j'ai ajouté une deuxième version

if(arrayName && arrayName.length)

Ensuite, j'ai fait un test pour la deuxième condition, en utilisant Scratchpad dans 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!");
}

ce qui prouve cela if(array2 && array2.length)et if(array2 && array2.length > 0)fait exactement la même chose

James Drinkard
la source
13
Je trouve que c'est le plus concis et couvre tous les problèmes d'exception. Et puisque vous aimez la véracité, pourrait même se contenter deif (arrayName && arrayName.length)
tsemer
2
Court et rapide! Il m'a fallu un certain temps en venant de C # pour m'habituer à if (obj) pour vérifier null, mais maintenant je l'adore: if (obj) // null check; if (array && array.length) // array null ou empty check; if (array &&! array.length) // array existe, mais vide check; if (str) // chaîne non nulle et non vide. Le seul problème est de ne pas utiliser de nombres si zéro est un nombre valide.
Rick Love
1
J'utilise (arrayName && arrayName.length) depuis un certain temps, puis je me suis inquiété si quelque chose pouvait mal tourner. Cette réponse m'a réconfortée, merci :)
Koray
Dans Typescript, il y a des nuances, car le var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0type pour isNotEmpty ne serait pas booléen, il serait booléen | non défini.
Giedrius
15

Tu devrais utiliser:

  if (image_array !== undefined && image_array.length > 0)
Samson
la source
8

Si vous voulez tester si la variable du tableau d'images a été définie, vous pouvez le faire comme ceci

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
la source
Ne fonctionne pas dl.dropbox.com/u/14396564/screens/…
user1564141
@ user1564141 difficile de dire où la fonction est déclarée par rapport à votre image_array définie. Vous rencontrez peut-être un problème d'hébergement, vous devrez donc peut-être déclarer cette variable comme var index_array = ... En outre, la balise de script dans laquelle vous définissez index_array est fermée. Il n'apparaît pas ainsi de la capture d'écran.
Mike Brant
Dans le reste est également alerte, qui ne se déclenche que lorsque le tableau est vide, mais le var image_array fonctionne à chaque fois ... Je ne comprends pas pourquoi?
user1564141
@ user1564141 Il serait utile que vous puissiez mettre à jour votre question pour afficher la source en sortie. Je ne sais toujours pas où réside votre logique if-else dans la source par rapport à l'emplacement de votre déclaration index_array.
Mike Brant
6

Javascript

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

Lodash & Underscore

( _.isArray(myArray) && myArray.length > 0 )
Amit Bhagat
la source
6

Vous pouvez utiliser jQuery isEmptyObject()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 

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

Mayank Raipure
la source
C'est la seule chose qui a fonctionné pour moi lors de l'ajout d'éléments avec array.push () - à partir d'éléments ajoutés dynamiquement (ajax). Merci
TomoMiha
3

Un moyen simple qui ne génère pas d'exceptions s'il n'existe pas et convertit en booléen:

!!array

Exemple:

if (!!arr) {
  // array exists
}
insigne
la source
3

Que dis-tu de ça ? la vérification de la longueur d'un tableau non défini peut générer une exception.

if(image_array){
//array exists
    if(image_array.length){
    //array has length greater than zero
    }
}
Nikul Patel
la source
Le niché ifpeut être évité en utilisant &&, comme dans image_array && image_array.length, il court-circuitera s'il image_arrayn'existe pas.
rvazquezglez
3

Pour moi, certaines des réponses les mieux notées "fonctionnent" lorsque je les mets dans jsfiddle, mais lorsque j'ai une quantité de liste de tableaux générée dynamiquement, une grande partie de ce code dans les réponses ne fonctionne tout simplement pas pour moi.

C'est ce qui fonctionne pour moi.

var from = [];

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

Remarquez, PAS de guillemets indéfinis et je ne me soucie pas de la longueur.

Tom Stickel
la source
1
deux commentaires: 1) typeofrenvoie une chaîne, la comparaison avec undefinedsera toujours flasy 2) vous ne vérifiez pas si elle fromest définie. votre code ci-dessus
générera
@Xeltor Non, ce ne sera pas le cas. veuillez fournir votre jsfiddle ou plunker pour le prouver ou supprimer votre commentaire.
Tom Stickel
@Xeltor, il suffit de regarder et il semble que votre réponse a -2 et plein de commentaires avec des gens disant en gras que vous avez tort.
Tom Stickel
3

chaînage optionnel

Comme la proposition de chaînage facultative a atteint l'étape 4 et obtient un soutien plus large, il existe un moyen très élégant de le faire

if(image_array?.length){

  // image_array is defined and has at least one element

}
LonelyCpp
la source
2

Je rencontre beaucoup ce problème en Javascript. Pour moi, la meilleure façon de le faire est de mettre un chèque très large avant de vérifier la longueur. J'ai vu d'autres solutions dans ce Q&R, mais je voulais pouvoir vérifier l'une nullou l' autre undefinedou toute autre valeur fausse.

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

Ce sera d' abord vérifier undefined, nullou d' autres valeurs fausses. Si l'une d'entre elles est vraie, cela complètera le booléen car c'est un OR. Ensuite, la vérification plus risquée de array.length, qui pourrait nous induire en erreur si le tableau n'est pas défini, peut être vérifiée. Cela ne sera jamais atteint si arrayest undefinedou null, donc l'ordre des conditions est très important.

Facteur Jim
la source
2

Utilisation de Undescore ou Lodash :

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

Vitaly
la source
1

Ce qui suit est ma solution enveloppée dans une fonction qui génère également des erreurs pour gérer quelques problèmes avec la portée de l'objet et tous les types de types de données possibles transmis à la fonction.

Voici mon violon utilisé pour examiner ce problème ( source )

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.
la source
0

Si vous n'avez pas de variable déclarée comme tableau, vous pouvez créer une vérification:

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

Cela vérifie si la variable x existe et si elle l'est, vérifie s'il s'agit d'un tableau rempli. sinon, il crée un tableau vide (ou vous pouvez faire d'autres choses);

Si vous êtes certain qu'une variable de tableau est créée, il suffit de vérifier:

var x = [];

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

Vous pouvez vérifier mon violon ici avec la plupart des façons possibles de vérifier le tableau.

Plippie
la source
0

Vous devriez faire ceci

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

Je pense que ce code simple fonctionnerait:

if(!(image_array<=0)){
//Specify function needed
}
Sachini Witharana
la source
-1

en ts

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

en html

(photos == non défini ||! (isArray (photos) && photos.length> 0))

velan
la source
3
Êtes-vous sûr de cela? La deuxième partie ne ressemble pas au HTML après tout
Nico Haase
-3

Lorsque vous créez votre image_array, il est vide, donc votre image_array.length est 0

Comme indiqué dans le commentaire ci-dessous, je modifie ma réponse en fonction de la réponse à cette question ):

var image_array = []

à l'intérieur des parenthèses else ne change rien à l'image_array définie auparavant dans le code

Al_th
la source
Je l'ai dans la source, lors du chargement de la page ... N'oubliez pas de poster.
user1564141
Je veux ajouter quelque chose à ma réponse qui peut être faux, alors je le dis ici. Dans les langages courants, ce qui est créé à l'intérieur d'un bloc n'est pas visible "à l'extérieur" du bloc. Comme vous le définissez []var image_array = []à l'intérieur du bloc else, je ne suis pas sûr qu'il puisse être vu à l'extérieur. Essayezimage_array = []
Al_th
mais si je supprime image_array du reste, tout fonctionne très bien.
user1564141