Verifique se uma matriz está vazia ou existe


358

Quando a página está carregando pela primeira vez, preciso verificar se há uma imagem image_arraye carregar a última imagem.

Caso contrário, desabilito os botões de visualização, alerta o usuário a pressionar o botão de nova imagem e cria uma matriz vazia para colocar as imagens;

O problema é que image_arraynos elseincêndios o tempo todo. Se existe uma matriz - ela simplesmente a substitui, mas o alerta não 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 = [];
}

ATUALIZAÇÃO Antes de carregar o html, tenho algo parecido com isto:

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>

Log do console image_array- o que você recebe?
Utkanos 31/07

@ Utkanos se houver var image_array = [] - indefinido se // var image_array = [] (comented) - array real.
user1564141

array? .length - amplamente suportado e será um recurso nativo em breve
Anbu Agarwal

Respostas:


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

Seu problema pode estar acontecendo devido a uma mistura de variáveis ​​globais implícitas e içamento de variáveis. Certifique-se de usar varsempre que declarar uma variável:

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

E certifique-se de nunca redeclarar acidentalmente essa variável mais tarde:

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

33
Não. Isso explodirá quando image_array for nulo. A lei de Murphy afirma que algum dia será.
Marco Faustinelli

7
Não é image_array.lengthsuficiente? (sem especificar >0)
mcont 12/04

Curioso: Você pode encontrar algum caso de uso que poderia ser interrompido usando a resposta de @JamesDrinkard?
tsemer 24/08/16

12
if (image_array && image_array.length){ // array exists and has elements
precisa saber é o seguinte

195

Para verificar se uma matriz está vazia ou não

Uma maneira moderna, ES5 +:

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

Uma maneira antiga:

typeof array != "undefined"
    && array != null
    && array.length != null
    && array.length > 0

Uma maneira compacta:

if (typeof array != "undefined" && array != null && array.length != null && array.length > 0) {
    // array exists and is not empty
}

Uma maneira do CoffeeScript:

if array?.length > 0

Por quê?

Caso Indefinido A
variável indefinida é uma variável que você ainda não atribuiu a ela.

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

Nulo do caso
Em geral, nulo é o estado em que falta um valor. Por exemplo, uma variável é nula quando você perdeu ou não conseguiu recuperar alguns dados.

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

Caso Não é uma matriz
Javascript possui um sistema de tipos dinâmicos. Isso significa que não podemos garantir que tipo de objeto uma variável contém. Há uma chance de que não estamos falando com uma instância do Array.

supposedToBeArray =  new SomeObject();
typeof supposedToBeArray.length;       // => "undefined"

array = new Array();
typeof array.length;                   // => "number"

Case Empty Array
Agora que testamos todas as outras possibilidades, estamos falando de uma instância de Array. Para garantir que não esteja vazio, perguntamos sobre o número de elementos que ele contém e certificando-se de que ele possui mais de zero elementos.

firstArray = [];
firstArray.length > 0;  // => false

secondArray = [1,2,3];
secondArray.length > 0; // => true

8
Por favor, note que é não suficiente apenas para verificar se há (typeof array != "undefined" && array.length > 0)porque se arrayé nulo nós vamos chegar TypeError: Cannot read property 'length' of null.
Pooyan Khosravi

Talvez mude && com ||
Sahar Ch.

!(typeof array !== "undefined") || !(array.length > 0)? Apenas tentei, tenho o mesmo erro. Você pode nos dar um exemplo completo de como usar ||?
Pooyan Khosravi

Eu quis dizer(typeof array != "undefined" || array.length > 0)
Sahar Ch.

Obrigado pela clarificação. (typeof array != "undefined" || array.length > 0)retorna truese array = null. !(typeof array != "undefined" || array.length > 0)retorna falsese array = [1,2]. Desculpe por não entender, mas @Elsa você pode fornecer um exemplo de trabalho? Desde já, obrigado.
Pooyan Khosravi

70

Que tal (ECMA 5.1):

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

11
Re .. && image_array.length). IMHO, embora você possa confiar com segurança na digitação solta de JS, para converter um 0número inteiro para falsee um non-zeronúmero inteiro para true, considero preferível, para facilitar a leitura no futuro, "dizer o que você quer dizer". Eu faria .. && image_array.length > 0).
Página Inicial>

28

É isso que eu uso. A primeira condição abrange a verdade, que é nula e indefinida. A segunda condição verifica se há uma matriz vazia.

if(arrayName && arrayName.length > 0){
    //do something.
}

ou, graças ao comentário do tsemer, adicionei uma segunda versão

if(arrayName && arrayName.length)

Então eu fiz um teste para a segunda condição, usando o Scratchpad no 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!");
}

o que também prova isso if(array2 && array2.length)e if(array2 && array2.length > 0)está fazendo exatamente o mesmo


13
Acho que isso é o mais conciso e abrange todos os problemas de exceção. E desde que você gosta de truthiness, poderia até mesmo fazer comif (arrayName && arrayName.length)
tsemer

2
Curto e rápido! Levei um tempo vindo do C # para me acostumar com if (obj) para verificar se há nulo, mas agora eu adoro: if (obj) // null check; if (array && array.length) // array nulo ou vazio; if (array &&! array.length) // array existe, mas cheque vazio; if (str) // string não nula e não vazia. A única opção é não usar números se zero for um número válido.
Rick Love

11
Eu tenho usado (arrayName && arrayName.length) por um tempo, então fiquei preocupado se algo poderia estar errado sobre isso. Essa resposta me confortou, obrigado :)
Koray

No TypeScript existem nuances, pois o var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0tipo para isNotEmpty não seria booleano, seria booleano | indefinido.
Giedrius

15

Você deveria usar:

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

8

Se você quiser testar se a variável de matriz de imagem foi definida, faça-o desta maneira

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


@ user1564141 difícil dizer onde a função está sendo declarada em relação ao seu image_array que está sendo definido. Você pode estar com um problema de hospedagem, portanto, pode ser necessário declarar essa variável como var index_array = ... Além disso, é a tag de script em que você define a index_array sendo fechada. Não aparece assim na captura de tela.
31512 Mike Brant

No else também está alerta, que é acionado apenas quando o array está vazio, mas o var image_array funciona toda vez ... Não consigo entender por que?
user1564141

@ user1564141 Ajudaria se você pudesse atualizar sua pergunta para mostrar a fonte como saída. Ainda não tenho noção de onde sua lógica if-else reside na fonte em relação ao local da sua declaração index_array.
31512 Mike Brant

6

Javascript

( typeof(myArray) !== 'undefined' && Array.isArray(myArray) && myArray.length > 0 )

Lodash & Sublinhado

( _.isArray(myArray) && myArray.length > 0 )

6

Você pode usar o jQuery isEmptyObject()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 

Fonte: https://api.jquery.com/jQuery.isEmptyObject/


Essa é a única coisa que funcionou para mim ao adicionar elementos com array.push () - a partir de elementos adicionados dinamicamente (ajax). Obrigado
TomoMiha 9/09/16

3

Uma maneira simples que não resulta em exceções, se não existir, e converta para booleano:

!!array

Exemplo:

if (!!arr) {
  // array exists
}

3

Que tal agora ? a verificação do comprimento da matriz indefinida pode gerar uma exceção.

if(image_array){
//array exists
    if(image_array.length){
    //array has length greater than zero
    }
}

O aninhado ifpode ser evitado usando &&, como em image_array && image_array.length, entrará em curto-circuito se image_arraynão existir.
rvazquezglez

3

Para mim, algumas das respostas mais bem classificadas "funcionam" quando eu as coloco no jsfiddle, mas quando tenho uma quantidade gerada dinamicamente de uma lista de arrays, muito desse código nas respostas simplesmente não funciona para mim.

É isso que está funcionando para mim.

var from = [];

if(typeof from[0] !== undefined) {
  //...
}

Observe, sem aspas indefinidas e não estou me incomodando com o comprimento.


11
dois comentários: 1) typeofretorna uma string, comparando com undefinedserá sempre flasy 2) você não verifica se fromestá definido. seu código acima irá lançar um erro se não é
Xeltor

@Xeltor Não, não vai. forneça seu jsfiddle ou plunker para provar isso ou remover seu comentário.
quer

@Xeltor, basta olhar e parece que sua resposta tem -2 e está repleta de comentários com pessoas dizendo em Negrito que você está errado.
21419 Tom Tomel

3

encadeamento opcional

Como a proposta de encadeamento opcional chegou ao estágio 4 e está recebendo um suporte mais amplo, há uma maneira muito elegante de fazer isso

if(image_array?.length){

  // image_array is defined and has at least one element

}

2

Me deparei com esse problema bastante em Javascript. Para mim, a melhor maneira de fazer isso é fazer uma verificação muito ampla antes de verificar o comprimento. Vi algumas outras soluções nesta sessão de perguntas e respostas, mas queria poder verificar se havia um nullou undefinedoutro valor falso.

if(!array || array.length == 0){
    console.log("Array is either empty or does not exist")
}

Isto irá primeiro verificar se há undefined, nullou outros valores falsos. Se algum deles for verdadeiro, ele completará o booleano, pois é um OR. Em seguida, a verificação mais arriscada array.length, que pode causar erros se a matriz for indefinida, pode ser verificada. Isso nunca será alcançado se arrayfor undefinedou null, portanto, a ordenação das condições é muito importante.



1

A seguir, minha solução envolve uma função que também gera erros para gerenciar alguns problemas com o escopo do objeto e todos os tipos de possíveis tipos de dados passados ​​para a função.

Aqui está o meu violino usado para examinar este problema ( fonte )

var jill = [0];
var jack;
//"Uncaught ReferenceError: jack is not defined"

//if (typeof jack === 'undefined' || jack === null) {
//if (jack) {
//if (jack in window) {
//if (window.hasOwnP=roperty('jack')){
//if (jack in window){

function isemptyArray (arraynamed){
    //cam also check argument length
  if (arguments.length === 0) { 
    throw "No argument supplied";
  }

  //console.log(arguments.length, "number of arguments found");
  if (typeof arraynamed !== "undefined" && arraynamed !== null) {
      //console.log("found arraynamed has a value");
      if ((arraynamed instanceof Array) === true){
        //console.log("I'm an array");
        if (arraynamed.length === 0) {
            //console.log ("I'm empty");
            return true;
        } else {
          return false;
        }//end length check
      } else {
        //bad type
        throw "Argument is not an array";
      } //end type check
  } else {
    //bad argument
    throw "Argument is invalid, check initialization";;
  }//end argument check
}

try {
  console.log(isemptyArray(jill));
} catch (e) {
    console.log ("error caught:",e);
}

0

Se você não tiver uma variável declarada como matriz, poderá criar uma verificação:

if(x && x.constructor==Array && x.length){
   console.log("is array and filed");
}else{
    var x= [];
    console.log('x = empty array');
}

Isso verifica se a variável x existe e, se existe, verifica se é uma matriz preenchida. caso contrário, ele cria uma matriz vazia (ou você pode fazer outras coisas);

Se você tem certeza de que existe uma variável de matriz criada, há uma verificação simples:

var x = [];

if(!x.length){
    console.log('empty');
} else {
    console.log('full');
}

Você pode verificar meu violino aqui com as maneiras mais possíveis de verificar a matriz.


0

Você deve fazer isso

    if (!image_array) {
      // image_array defined but not assigned automatically coerces to false
    } else if (!(0 in image_array)) {
      // empty array
      // doSomething
    }

0

Eu acho que esse código simples funcionaria:

if(!(image_array<=0)){
//Specify function needed
}

-1

em st

 isArray(obj: any) 
{
    return Array.isArray(obj)
  }

em html

(fotos == indefinido ||! (isArray (fotos) && photos.length> 0))


3
Você tem certeza sobre isso? A segunda parte não se parece com HTML depois de tudo
Nico Haase

-3

Quando você cria seu image_array, ele está vazio; portanto, o image_array.length é 0

Conforme declarado no comentário abaixo, edito minha resposta com base na resposta desta pergunta ):

var image_array = []

dentro dos colchetes else não muda nada para o image_array definido anteriormente no código


Eu o tenho na fonte, ao carregar a página ... Apenas esqueça de postar.
user1564141

Quero adicionar algo à minha resposta que possa estar errado, por isso afirmo aqui. Em idiomas comuns, o que é criado dentro de um bloco não é visível "fora" do bloco. Como você define []var image_array = []dentro do bloco else, não tenho certeza de que possa ser visto lá fora. Tenteimage_array = []
Al_th 31/07/12

mas se eu remover image_array do resto tudo funciona muito bem.
user1564141
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.