Controlla se un array è vuoto o esiste


358

Quando la pagina viene caricata per la prima volta, devo verificare se è presente un'immagine image_arraye caricare l'ultima immagine.

Altrimenti, disabilito i pulsanti di anteprima, avvisare l'utente di premere il nuovo pulsante immagine e creare un array vuoto per mettere le immagini;

Il problema è che image_arraynei elsefuochi sempre. Se esiste un array, lo sovrascrive, ma l'avviso non funziona.

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 = [];
}

AGGIORNAMENTO Prima di caricare HTML, ho qualcosa del genere:

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

Registro della console image_array: cosa ottieni?
Utkanos,

@Utkanos se c'è var image_array = [] - undefined se // var image_array = [] (commentato) - array reale.
user1564141

array? .length - ampiamente supportato e presto sarà una funzionalità nativa
Anbu Agarwal

Risposte:


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

Il problema potrebbe verificarsi a causa di un mix di variabili globali implicite e sollevamento di variabili. Assicurati di usare varogni volta che dichiari una variabile:

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

E quindi assicurati di non dichiarare mai più accidentalmente quella variabile in seguito:

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

33
No. Questo esploderà quando image_array è null. La legge di Murphy afferma che un giorno lo farà.
Marco Faustinelli,

7
Non è image_array.lengthabbastanza? (senza specificare >0)
Mc

Curioso: riesci a trovare un caso d'uso che potrebbe rompersi usando la risposta di @JamesDrinkard?
Tsemer,

12
if (image_array && image_array.length){ // array exists and has elements
YeeHaw1234

195

Per verificare se un array è vuoto o meno

Un modo moderno, ES5 +:

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

Un modo vecchio stile:

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

Un modo compatto:

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

Un modo CoffeeScript:

if array?.length > 0

Perché?

Case Undefined Una
variabile non definita è una variabile che non le è stata ancora assegnata.

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

Case Null
In generale, null è lo stato in cui manca un valore. Ad esempio, una variabile è nulla in caso di mancato recupero o mancato recupero di alcuni dati.

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

Caso non un array
Javascript ha un sistema di tipo dinamico. Ciò significa che non possiamo garantire il tipo di oggetto contenuto in una variabile. È possibile che non stiamo parlando di un'istanza di Array.

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

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

Case Empty Array
Ora da quando abbiamo provato tutte le altre possibilità, stiamo parlando di un'istanza di Array. Per assicurarci che non sia vuoto, chiediamo il numero di elementi che contiene e assicurandoci che abbia più di zero elementi.

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

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

8
Si prega di notare che è non è sufficiente verificare solo per (typeof array != "undefined" && array.length > 0)perché se arrayè nullo ci arriveremo TypeError: Cannot read property 'length' of null.
Pooyan Khosravi,

Forse cambia && con ||
Sahar Ch.

!(typeof array !== "undefined") || !(array.length > 0)? Ho appena provato, ho avuto lo stesso errore. Puoi darci un esempio completo di come usare ||?
Pooyan Khosravi,

Intendevo(typeof array != "undefined" || array.length > 0)
Sahar Ch.

Grazie per il chiarimento. (typeof array != "undefined" || array.length > 0)restituisce trueif array = null. !(typeof array != "undefined" || array.length > 0)restituisce falseif array = [1,2]. Ci scusiamo per non aver capito, ma @Elsa puoi fornire un esempio funzionante? Grazie in anticipo.
Pooyan Khosravi,

70

Che ne dici (ECMA 5.1):

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

1
Ri .. && image_array.length). IMHO, mentre puoi tranquillamente affidarti alla tipizzazione libera di JS, per convertire un 0numero intero in falseun non-zeronumero intero true, lo considero preferibile, per la leggibilità in futuro, a "dire cosa intendi". Lo farei .. && image_array.length > 0).
ToolmakerSteve

28

Questo è quello che uso. La prima condizione riguarda la verità, che ha sia null che indefinito. La seconda condizione controlla un array vuoto.

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

o grazie al commento di Tsemer ho aggiunto una seconda versione

if(arrayName && arrayName.length)

Quindi ho fatto un test per la seconda condizione, usando Scratchpad in 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!");
}

che lo dimostra anche if(array2 && array2.length)e if(array2 && array2.length > 0)stanno facendo esattamente lo stesso


13
Trovo che questo sia il più conciso e copre tutti i problemi di eccezione. E poiché ti piace la verità, potresti persino if (arrayName && arrayName.length)
accontentarti di

2
Breve e veloce! Mi ci è voluto un po 'di tempo da C # per abituarmi a if (obj) per verificare la presenza di null, ma ora lo adoro: if (obj) // null check; if (array && array.length) // array null o controllo vuoto; if (array &&! array.length) // array esiste, ma controllo vuoto; if (str) // string non è nullo e non è vuoto. L'unico gotcha è non usare sui numeri se zero è un numero valido.
Rick Love,

1
Sto usando (arrayName && arrayName.length) da un po 'di tempo, poi mi sono preoccupato se potesse esserci qualcosa di sbagliato. Questa risposta mi ha confortato, grazie :)
Koray,

In Typescript ci sono delle sfumature, poiché per var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0type for isNotEmpty non sarebbe booleano, sarebbe booleano | indefinito.
Giedrius,

15

Dovresti usare:

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

8

Se si desidera verificare se la variabile dell'array di immagini è stata definita, è possibile farlo in questo modo

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 difficile dire dove viene dichiarata la funzione in relazione all'impostazione di image_array. Potresti avere un problema di hosting, quindi potresti dover dichiarare quella variabile come var index_array = ... Inoltre, è il tag di script in cui hai impostato la chiusura di index_array. Non appare così dallo screenshot.
Mike Brant,

Anche nell'altro è attento, che si attiva solo quando l'array è vuoto, ma var image_array funziona ogni volta ... Non riesco a capire perché?
user1564141

@ user1564141 Sarebbe utile se fosse possibile aggiornare la domanda per mostrare l'origine come output. Non ho ancora idea di dove risieda la tua logica if-else all'interno del sorgente rispetto alla posizione della tua dichiarazione index_array.
Mike Brant,

6

JavaScript

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

Lodash e Underscore

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

6

È possibile utilizzare jQuery isEmptyObject()per verificare se l'array contiene elementi o meno.

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/


Questa è l'unica cosa che ha funzionato per me quando ho aggiunto elementi con array.push () - da elementi aggiunti dinamicamente (ajax). Grazie
TomoMiha,

3

Un modo semplice che non comporta eccezioni se non esiste e converti in booleano:

!!array

Esempio:

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

3

Cosa ne pensi di questo ? il controllo della lunghezza dell'array non definito può generare eccezioni.

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

Il nidificato ifpuò essere evitato usando &&, come in image_array && image_array.length, andrà in corto circuito se image_arraynon esiste.
rvazquezglez,

3

Per me alcune delle risposte più votate "funzionano" quando le inserisco in jsfiddle, ma quando ho una quantità di elenco di array generata dinamicamente un sacco di questo codice nelle risposte non funziona per ME.

Questo è ciò che funziona per me.

var from = [];

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

Notate, NESSUNA virgoletta non definita e non mi sto preoccupando della lunghezza.


1
due commenti: 1) typeofrestituisce una stringa, il confronto con undefinedsarà sempre flasy 2) non si controlla se fromè definito. il tuo codice sopra genererà un errore se non lo è
Xeltor

@Xeltor No, non lo farà. fornisci il tuo jsfiddle o plunker per dimostrarlo o rimuovere il tuo commento.
Tom Stickel,

@Xeltor, sto solo guardando e sembra che la tua risposta abbia -2 e piena zeppa di commenti con le persone che dicono in GRASSETTO che sei SBAGLIATO.
Tom Stickel,

3

concatenamento opzionale

Poiché la proposta di concatenazione opzionale ha raggiunto la fase 4 e sta ottenendo un sostegno più ampio, esiste un modo molto elegante per farlo

if(image_array?.length){

  // image_array is defined and has at least one element

}

2

Mi imbatto molto in questo problema in Javascript. Per me il modo migliore per farlo è quello di effettuare un controllo molto ampio prima di verificare la lunghezza. Ho visto alcune altre soluzioni in queste domande e risposte, ma volevo essere in grado di verificare uno nullo undefinedaltri valori falsi.

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

Questo sarà prima verificare la presenza undefined, nullo altri valori falsi. Se uno di questi è vero, completerà il booleano in quanto questo è un OR. Quindi array.lengthpuò essere verificato il controllo più rischioso di , che potrebbe errarci se l'array non è definito. Questo non sarà mai raggiunto se lo arrayè undefinedo null, quindi l'ordine delle condizioni è molto importante.



1

La seguente è la mia soluzione racchiusa in una funzione che genera anche errori per gestire un paio di problemi con l'ambito dell'oggetto e tutti i tipi di possibili tipi di dati passati alla funzione.

Ecco il mio violino usato per esaminare questo 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 non hai una variabile dichiarata come matrice, puoi creare un segno di spunta:

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

Controlla se esiste la variabile x e se lo è, controlla se si tratta di un array pieno. altrimenti crea un array vuoto (oppure puoi fare altre cose);

Se si è certi che sia stata creata una variabile di matrice, è presente un semplice controllo:

var x = [];

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

Puoi controllare il mio violino qui con mostra i modi più possibili per controllare l'array.


0

Dovresti farlo

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

0

Penso che questo semplice codice funzionerebbe:

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

-1

in ts

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

in html

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


3
Sei sicuro di questo? La seconda parte non sembra HTML dopo tutto
Nico Haase,

-3

Quando crei image_array, è vuoto, quindi image_array.length è 0

Come indicato nel commento qui sotto, modifico la mia risposta in base alla risposta di questa domanda ):

var image_array = []

all'interno delle parentesi else non cambia nulla in image_array definito in precedenza nel codice


Ce l'ho nella fonte, quando si carica la pagina ... Basta dimenticare di pubblicare.
user1564141

Voglio aggiungere qualcosa alla mia risposta che potrebbe essere sbagliato, quindi lo dichiaro qui. Nelle lingue comuni, ciò che viene creato all'interno di un blocco non è visibile "all'esterno" del blocco. Come si definisce []var image_array = []all'interno del blocco else, non sono sicuro che possa essere visto all'esterno. Provaimage_array = []
Al_th

ma se rimuovo image_array dall'altro tutto funziona bene.
user1564141
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.