Verifique se a matriz está vazia ou nula

106

Gostaria de saber como verificar se um array está vazio ou nulo no jQuery. Eu tentei, array.length === 0mas não funcionou. Também não gerou nenhum erro.

Este é o 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
fonte
2
Da mesma forma que em "JavaScript normal": stackoverflow.com/questions/2672380/…
Julien Schmidt
1
@Julien, eu tentei todas as soluções listadas naquele tópico antes de iniciar este tópico. Nenhum deles funcionou de alguma forma.
entrada
Podemos obter mais código para contexto? Circundando JavaScript, HTML? Tem certeza de que $("input[name='album_text[]']")está realmente retornando elementos?
Jon Adams
@JulienSchmidt: a questão que você vinculou é sobre como verificar se um valor de array está vazio, não o array inteiro.
Dan Dascalescu

Respostas:

168

Contanto que seu seletor esteja realmente funcionando, não vejo nada de errado com o seu código que verifica o comprimento da matriz. Isso deve fazer o que você quiser. Existem várias maneiras de limpar seu código para torná-lo mais simples e legível. Aqui está uma versão limpa com notas sobre o que eu limpei.

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
}

Algumas notas sobre o que você estava fazendo e o que mudei.

  1. $(this)é sempre um objeto jQuery válido, portanto, não há motivo para verificar if ($(this)). Ele pode não ter nenhum objeto DOM dentro dele, mas você pode verificar $(this).lengthse precisar, mas isso não é necessário aqui porque o .each()loop não seria executado se não houvesse itens $(this)dentro de seu.each() loop sempre haverá algo.
  2. É ineficiente usar $ (this) várias vezes na mesma função. É muito melhor colocá-lo uma vez em uma variável local e usá-lo a partir dessa variável local.
  3. É recomendado inicializar arrays com em []vez de new Array().
  4. if (value)quando o valor é esperado para ser uma string protegerá de value == null, value == undefinede value == ""então você não precisa fazer if (value && (value != "")). Você pode apenas fazer: if (value)para verificar todas as três condições vazias.
  5. if (album_text.length === 0) irá informá-lo se o array está vazio, desde que seja um array inicializado válido (que está aqui).

O que você está tentando fazer com este seletor $("input[name='album_text[]']")?

jfriend00
fonte
5
@MaciekSemik - consulte stackoverflow.com/questions/359494/… . Eu sempre uso igualdade estrita ( ===), a menos que queira especificamente permitir uma conversão de tipo. É um bom hábito para adquirir.
jfriend00
73

O usuário JQuery é EmptyObject para verificar se a matriz contém elementos ou não.

var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true
Mayank Raipure
fonte
2
Muito mais confiável do que verificar o comprimento, especialmente se sua variável também pode ser um objeto (com objetos, comprimento não funciona para verificar se está vazio).
magnífico
Esta é a resposta mais apropriada em minha opinião.
dias
4
isEmptyObjectsempre retorna falsese Array.prototypefor estendido, por exemplo Array.prototype.someFunction = function () {};- mesmo se a matriz estiver vazia. Observe que alguns frameworks (por exemplo, Ember.js) estendem o protótipo Array por padrão.
jesenko
4
Tenha cuidado com isEmptyObject! Para jQuery 1.8.3 jQuery.isEmptyObject([])retorna false, mas para jQuery 1.11.3 ele retorna true. Na verdade, a documentação do jQuery diz que O argumento deve sempre ser um Objeto JavaScript simples, pois outros tipos de objeto (elementos DOM, strings / números primitivos, objetos de host) podem não fornecer resultados consistentes em navegadores. Desculpe, não vi a resposta de @rhinoxi.
Dmitry Vershinin
8

Você deve verificar se há ''(string vazia) antes de inserir o array. Seu array possui elementos que são strings vazias. Então você album_text.length === 0vai funcionar muito bem.

Daniel A. White
fonte
Por favor, veja o código atualizado. Eu adicionei este código, if( $(this).val() && $(this).val() != '') mas ele não funciona.
entrada de
8

Eu acho que é perigoso usar $ .isEmptyObject do jquery para verificar se o array está vazio, como @jesenko mencionou. Acabei de encontrar esse problema.

No documento isEmptyObject , ele menciona:

O argumento deve ser sempre um objeto JavaScript simples

pelo qual você pode determinar $.isPlainObject. O retorno de $.isPlainObject([])é falso.

rinoxi
fonte