Compruebe si la matriz está vacía o nula

106

Me gustaría saber cómo verificar si una matriz está vacía o nula en jQuery. Lo intenté array.length === 0pero no funcionó. Tampoco arrojó ningún error.

Este es el código:

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
}
entrada
fuente
2
De la misma manera que en "JavaScript normal": stackoverflow.com/questions/2672380/…
Julien Schmidt
1
@Julien, probé todas las soluciones enumeradas en ese hilo antes de comenzar este hilo. Ninguno de ellos funcionó de alguna manera.
entrada
¿Podemos obtener más código para el contexto? ¿Rodeando JavaScript, HTML? ¿Estás seguro de que en $("input[name='album_text[]']")realidad están devolviendo elementos?
Jon Adams
@JulienSchmidt: la pregunta a la que vinculó es sobre verificar si un valor de matriz está vacío, no toda la matriz.
Dan Dascalescu

Respuestas:

168

Siempre que su selector esté funcionando, no veo nada malo en su código que verifica la longitud de la matriz. Eso debería hacer lo que quieras. Hay muchas formas de limpiar su código para que sea más simple y legible. Aquí hay una versión limpia con notas sobre lo que limpié.

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
}

Algunas notas sobre lo que estabas haciendo y lo que cambié.

  1. $(this)es siempre un objeto jQuery válido, por lo que no hay razón para verificarlo if ($(this)). Puede que no tenga ningún objeto DOM dentro, pero puede verificarlo $(this).lengthsi lo necesita, pero eso no es necesario aquí porque el .each()ciclo no se ejecutaría si no hubiera elementos, por lo que $(this)dentro de su .each()ciclo siempre habrá algo.
  2. Es ineficiente usar $ (this) varias veces en la misma función. Es mucho mejor ponerlo una vez en una variable local y luego usarlo desde esa variable local.
  3. Se recomienda inicializar las matrices con en []lugar de new Array().
  4. if (value)cuando se espera que el valor sea una cadena, ambos protegerán y value == null, por lo tanto, no tendrá que hacerlo . Simplemente puede hacer: para verificar las tres condiciones vacías.value == undefinedvalue == ""if (value && (value != ""))if (value)
  5. if (album_text.length === 0) le dirá si la matriz está vacía siempre que sea una matriz inicializada válida (que está aquí).

¿Qué intentas hacer con este selector $("input[name='album_text[]']")?

jfriend00
fuente
5
@MaciekSemik: consulte stackoverflow.com/questions/359494/… . Siempre uso la igualdad estricta ( ===) a menos que específicamente quiera permitir una conversión de tipo. Es un buen hábito para adquirir.
jfriend00
73

El usuario JQuery es EmptyObject para verificar si la matriz contiene elementos o no.

var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true
Mayank Raipure
fuente
2
Mucho más confiable que verificar la longitud, especialmente si su variable también puede ser un objeto (con objetos, la longitud no funciona para verificar si está vacía).
gaborous
Esta es la respuesta más apropiada en mi opinión.
2015
4
isEmptyObjectsiempre devuelve falsesi Array.prototypeestá extendido, por ejemplo Array.prototype.someFunction = function () {};, incluso si la matriz está vacía. Tenga en cuenta que algunos marcos (por ejemplo, Ember.js) amplían el prototipo de Array de forma predeterminada.
jesenko
4
Tenga cuidado con isEmptyObject! Para jQuery 1.8.3 jQuery.isEmptyObject([])devuelve false, pero para jQuery 1.11.3 devuelve true. En realidad, la documentación de jQuery dice que el argumento siempre debe ser un objeto JavaScript simple, ya que otros tipos de objetos (elementos DOM, cadenas / números primitivos, objetos host) pueden no dar resultados consistentes en todos los navegadores. Lo siento, no vi la respuesta de @rhinoxi.
Dmitry Vershinin
8

Debe verificar ''(cadena vacía) antes de ingresar a su matriz. Su matriz tiene elementos que son cadenas vacías. Entonces album_text.length === 0funcionará bien.

Daniel A. White
fuente
Consulte el código actualizado. Agregué este código if( $(this).val() && $(this).val() != '') pero no funciona.
entrada
8

Creo que es peligroso usar $ .isEmptyObject de jquery para verificar si la matriz está vacía, como mencionó @jesenko. Acabo de encontrarme con ese problema.

En el documento isEmptyObject , menciona:

El argumento siempre debe ser un objeto JavaScript simple

que puede determinar por $.isPlainObject. El regreso de $.isPlainObject([])es falso.

rinoceronte
fuente