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

7 minutos de lectura

avatar de usuario de user1564141
usuario1564141

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

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

El problema es ese image_array en el 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; ?>

  • Registro de la consola image_array – ¿qué sacas?

    – Mitia

    31 de julio de 2012 a las 15:23

  • @Utkanos si hay var image_array = [] – indefinido si //var image_array = [] (comentado) – matriz real.

    – usuario1564141

    31 de julio de 2012 a las 15:31


  • array?.length: ampliamente compatible y pronto será una característica nativa

    – Anbu Agarval

    9 de junio de 2020 a las 14:33

avatar de usuario de jbabey
bebe

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

Su problema puede estar ocurriendo debido a una combinación de variables globales implícitas y elevación de variables. Asegúrate de usar var cada vez que se declara una variable:

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

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

else {
    ...
    image_array = []; // no var here
}

  • No. Esto explotará cuando image_array sea nulo. La ley de Murphy establece que algún día lo hará.

    – Marco Faustinelli

    20 de marzo de 2015 a las 6:32

  • no es image_array.length ¿suficiente? (sin especificar >0)

    – mcont

    12 de abril de 2015 a las 12:56

  • Curioso: ¿Puede encontrar algún caso de uso que se rompa con la respuesta de @JamesDrinkard?

    – tsemer

    24 de agosto de 2016 a las 9:01

  • if (image_array && image_array.length){ // array exists and has elements

    – YeeHaw1234

    4 de noviembre de 2016 a las 18:53


  • esto falla por let image_array = new Array(10);.

    – Saket Kumar

    12 de noviembre de 2020 a las 0:30

Avatar de usuario de Pooyan Khosravi
Pooyan Khosravi

Para verificar 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

Una variable indefinida es una variable a la que aún no le ha asignado nada.

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

caso nulo

En términos generales, nulo es un estado de falta de valor. Por ejemplo, una variable es nula cuando se perdió o no pudo recuperar algunos datos.

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

Caso no es una matriz

Javascript tiene un sistema de tipo dinámico. 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"

Matriz vacía de caso

Ahora que probamos todas las demás posibilidades, estamos hablando con 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

  • Tenga en cuenta que es no suficiente para comprobar (typeof array != "undefined" && array.length > 0) porque si array es nulo obtendremos TypeError: Cannot read property 'length' of null.

    – Pooyan Khosravi

    9 mayo 2014 a las 20:56

  • Tal vez cambie && con ||

    – Sahar Ch.

    30 de mayo de 2014 a las 13:42


  • !(typeof array !== "undefined") || !(array.length > 0)? Acabo de intentarlo, tengo el mismo error. ¿Puede darnos un ejemplo completo de cómo usar ||?

    – Pooyan Khosravi

    30 de mayo de 2014 a las 16:12

  • me refería (typeof array != "undefined" || array.length > 0)

    – Sahar Ch.

    30 de mayo de 2014 a las 23:24

  • Gracias por la aclaración. (typeof array != "undefined" || array.length > 0) devoluciones true si array = null. !(typeof array != "undefined" || array.length > 0) devoluciones false si array = [1,2]. Perdón por no entender, pero @Elsa, ¿puede dar un ejemplo de trabajo? Gracias por adelantado.

    – Pooyan Khosravi

    02/06/2014 a las 20:50

Avatar de usuario de Queequeg
Queequeg

¿Qué tal (ECMA 5.1):

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

  • Re .. && image_array.length). En mi humilde opinión, mientras tú pueden confíe de forma segura en la escritura suelta de JS, para convertir un 0 entero a false y un non-zero entero a true, considero preferible, para facilitar la lectura en el futuro, “decir lo que quieres decir”. yo lo haría .. && image_array.length > 0).

    – El fabricante de herramientas Steve

    12 de octubre de 2019 a las 12:17

Avatar de usuario de James Drinkard
james bebedor

Esto es lo que uso. La primera condición cubre la veracidad, que tiene tanto nula como indefinida. La segunda condición comprueba si hay 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 que también prueba que if(array2 && array2.length) y if(array2 && array2.length > 0) están haciendo exactamente lo mismo

encadenamiento opcional

Como la propuesta de encadenamiento opcional alcanzó la etapa 4 y está recibiendo un apoyo más amplio, hay una forma muy elegante de hacerlo.

if(image_array?.length){

  // image_array is defined and has at least one element

}

Deberías usar:

  if (image_array !== undefined && image_array.length > 0)

Si desea probar si la variable de matriz de imagen se ha definido, puede hacerlo así

if(typeof image_array === 'undefined') {
    // it is not defined yet
} else if (image_array.length > 0) {
    // you have a greater than zero length array
}

  • No funciona dl.dropbox.com/u/14396564/pantallas/…

    – usuario1564141

    31 de julio de 2012 a las 15:29

  • @ user1564141 es difícil saber dónde se declara la función en relación con la configuración de image_array. Es posible que tenga un problema de alojamiento, por lo que es posible que deba declarar esa variable como var index_array = … Además, es la etiqueta del script donde configuró index_array que se cierra. No parece tan de la captura de pantalla.

    –Mike Brant

    31 de julio de 2012 a las 15:35


  • En el resto también está alerta, que se dispara solo cuando la matriz está vacía, pero la var image_array funciona siempre … No puedo entender por qué.

    – usuario1564141

    31 de julio de 2012 a las 15:38

  • @ user1564141 Sería útil si pudiera actualizar su pregunta para mostrar la fuente como salida. Todavía no tengo una idea de dónde reside su lógica if-else dentro de la fuente en relación con la ubicación de su declaración index_array.

    –Mike Brant

    31 de julio de 2012 a las 15:41

¿Ha sido útil esta solución?