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
}

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[]']")?


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

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.