2011-08-25 16 views
83

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

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 
} 
+2

De la misma manera que en "JavaScript normal": http: // stackoverflow.com/questions/2672380/how-do-i-check-if-a-javascript-array-value-is-empty-or-null –

+1

@Julien, probé todas las soluciones enumeradas en ese hilo antes de iniciar este hilo. Ninguno de ellos funcionó de alguna manera. – input

+0

¿Podemos obtener más código para el contexto? ¿JavaScript circundante, HTML? ¿Estás seguro de que '$ (" input [name = 'album_text []'] ")' en realidad está devolviendo elementos? –

Respuesta

123

Mientras su selector esté funcionando, no veo nada incorrecto con su código que verifique la longitud de la matriz. Eso debería hacer lo que quieras. Hay muchas maneras de limpiar su código para que sea más simple y más 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 ha estado haciendo y lo que he cambiado.

  1. $(this) es siempre un objeto jQuery válida por lo que no hay razón alguna para comprobar if ($(this)). Puede que no contenga ningún objeto DOM, pero puede verificarlo con $(this).length si es necesario, pero no es necesario porque el bucle .each() no se ejecutaría si no hubiera elementos, así que $(this) dentro de su bucle .each() siempre estará alguna cosa.
  2. Es ineficaz usar $ (esto) varias veces en la misma función. Es mucho mejor conseguirlo una vez en una variable local y luego usarlo desde esa variable local. Se recomienda inicializar matrices con [] en lugar de new Array().
  3. if (value) cuando se espera que el valor de ser una cadena será tanto protegerlo de value == null, value == undefined y value == "" por lo que no tiene que hacer if (value && (value != "")). Puede hacer: if (value) para verificar las tres condiciones vacías.
  4. 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é está tratando de hacer con este selector $("input[name='album_text[]']")?

+5

@MaciekSemik - ver http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons. Siempre utilizo la igualdad estricta ('===') a menos que específicamente quiera permitir una conversión de tipo. Es un buen hábito para entrar. – jfriend00

6

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

+0

Por favor, vea el código actualizado. Agregué este código 'if ($ (this) .val() && $ (this) .val()! = '')' Pero no funciona. – input

55

Usuario JQuery es EmptyObject para comprobar 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 
+1

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

+0

Esta es la respuesta más adecuada en mi opinión. – earl3s

+3

'isEmptyObject' siempre devuelve' false' si 'Array.prototype' se extiende, p. '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 matriz de forma predeterminada. – jesenko

6

creo que es peligroso utilizar $ .isEmptyObject de jQuery para comprobar si la matriz está vacía, como se ha mencionado @jesenko. Acabo de conocer ese problema.

En el isEmptyObject doc, se menciona:

El argumento debe ser siempre una llanura JavaScript Object

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

Cuestiones relacionadas