¿Cómo comprobar si una matriz está vacía o existe?

Resuelto user1564141 asked hace 12 años • 24 respuestas

Cuando la página se carga por primera vez, necesito verificar si hay una imagen image_arrayy cargar la última imagen.

De lo contrario, desactivo los botones de vista previa, advierto al usuario que presione el botón de nueva imagen y creo una matriz vacía para colocar las imágenes;

El problema es que image_arrayen los elseincendios todo el tiempo. Si existe una matriz, simplemente la anula, pero la alerta no funciona.

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

ACTUALIZAR Antes de cargar html, tengo algo como esto:

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>
user1564141 avatar Jul 31 '12 22:07 user1564141
Aceptado
if (typeof image_array !== 'undefined' && image_array.length > 0) {
    // the array is defined and has at least one element
}

Su problema puede deberse a una combinación de variables globales implícitas y elevación de variables. Asegúrese de utilizar varsiempre que declare una variable:

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

Y luego asegúrese de no volver a declarar accidentalmente esa variable más tarde:

else {
    ...
    image_array = []; // no var here
}
jbabey avatar Jul 31 '2012 15:07 jbabey

Para comprobar si una matriz está vacía o no

Una forma moderna, ES5+:

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

Una manera de la vieja escuela:

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

Una forma compacta:

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

Una forma de CoffeeScript:

if array?.length > 0

¿Por qué?

Caso Indefinido
La variable indefinida es una variable a la que aún no se le ha asignado nada.

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

Caso Nulo
En términos generales, nulo es un estado en el que falta un valor. Por ejemplo, una variable es nula cuando omitió o no pudo recuperar algunos datos.

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

Case Not an Array
Javascript tiene un sistema de tipos dinámicos. Esto significa que no podemos garantizar qué tipo de objeto contiene una variable. Existe la posibilidad de que no estemos hablando de una instancia de Array.

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

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

Case Empty Array
Ahora que probamos todas las demás posibilidades, estamos hablando de una instancia de Array. Para asegurarnos de que no esté vacío, preguntamos sobre la cantidad de elementos que contiene y nos aseguramos de que tenga más de cero elementos.

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

secondArray = [1,2,3];
secondArray.length > 0; // => true
Pooyan Khosravi avatar Jan 05 '2014 22:01 Pooyan Khosravi

¿Qué tal (ECMA 5.1)?

if(Array.isArray(image_array) && image_array.length){
  // array exists and is not empty
}
Queequeg avatar Feb 22 '2016 19:02 Queequeg

Esto es lo que uso. La primera condición cubre la veracidad, que tiene tanto nulo como indefinido. La segunda condición busca una matriz vacía.

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

o gracias al comentario de tsemer agregué una segunda versión

if(arrayName && arrayName.length)

Luego hice una prueba para la segunda condición, usando Scratchpad en 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!");
}
Expandir fragmento

lo cual también prueba eso if(array2 && array2.length)y if(array2 && array2.length > 0)están haciendo exactamente lo mismo

James-Jesse Drinkard avatar Jun 21 '2016 20:06 James-Jesse Drinkard