¿Cómo comprobar si una matriz está vacía o existe?
Cuando la página se carga por primera vez, necesito verificar si hay una imagen image_array
y 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_array
en los else
incendios 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; ?>
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 var
siempre 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
}
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
¿Qué tal (ECMA 5.1)?
if(Array.isArray(image_array) && image_array.length){
// array exists and is not empty
}
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!");
}
lo cual también prueba eso if(array2 && array2.length)
y if(array2 && array2.length > 0)
están haciendo exactamente lo mismo