Come posso controllare JavaScript se esiste un valore in un determinato indice di array?


521

Funzionerà per verificare se esiste o meno un valore nella posizione "indice" o esiste un modo migliore:

if(arrayName[index]==""){
     // do stuff
}

6
Si noti che non si desidera verificare se l'intero array è vuoto, solo una determinata posizione che ha il valore di indice di "indice"
Ankur

Il titolo può essere migliorato dicendo "Come posso verificare in JavaScript se esiste un valore in un determinato indice di array".
Demisx,

Risposte:


738

Concettualmente, le matrici in JavaScript contengono array.lengthelementi, a partire array[0]da fino a array[array.length - 1]. Un elemento array con indice iviene definito come parte dell'array se icompreso tra 0e array.length - 1compreso. Se non sono in questo intervallo non è nell'array.

Quindi, per concetto, le matrici sono lineari, iniziando da zero e andando al massimo, senza alcun meccanismo per avere "spazi vuoti" all'interno di quell'intervallo in cui non esistono voci. Per scoprire se esiste un valore in un determinato indice di posizione (dove l'indice è 0 o un numero intero positivo), letteralmente usi semplicemente

if (i >= 0 && i < array.length) {
  // it is in array
}

Ora, sotto il cofano, i motori JavaScript quasi sicuramente non alloteranno lo spazio dell'array in modo lineare e contiguo in questo modo, poiché non avrebbe molto senso in un linguaggio dinamico e sarebbe inefficiente per un determinato codice. Probabilmente sono tabelle hash o una combinazione ibrida di strategie, e gli intervalli indefiniti dell'array probabilmente non sono assegnati alla propria memoria. Tuttavia, JavaScript il linguaggio vuole presentare le matrici di array.length n come aventi n membri e sono nominate da 0 a n - 1 e qualsiasi cosa in questo intervallo fa parte dell'array.

Ciò che probabilmente vuoi, tuttavia, è sapere se un valore in un array è in realtà qualcosa di definito , cioè non lo è undefined. Forse vuoi anche sapere se è definito e nonull . È possibile aggiungere membri a un array senza mai impostarne il valore: ad esempio, se si aggiungono valori di array aumentando la array.lengthproprietà, tutti i nuovi valori saranno undefined.

Per determinare se un determinato valore è qualcosa di significativo o è stato definito. Cioè, no undefined o null:

if (typeof array[index] !== 'undefined') {

o

if (typeof array[index] !== 'undefined' && array[index] !== null) {

È interessante notare che, a causa delle regole di confronto di JavaScript, il mio ultimo esempio può essere ottimizzato fino a questo:

if (array[index] != null) {
  // The == and != operators consider null equal to only null or undefined
}  

6
È molto probabile che l'OP sappia con quale tipo di array si sta occupando, ma solo per completezza: gli oggetti simili a array in genere contengono anche una lengthproprietà, nel qual caso i successivi due esempi sono più appropriati.
Justin Johnson,

9
puoi sempre sostituirlo foo !== 'undefined' && foo !== nullcon justfoo != null
thinklinux il

1
@TheComposer secondo la lingua la dimensione di un array in Javascript è definita da array.length e si dice che l'array comprenda tutti gli elementi da 0a array.length - 1. Tuttavia, non tutti questi valori saranno definiti . Se si utilizza la parola chiave delete su un membro dell'array, il membro tornerà a essere indefinito, proprio come se si estenda un array aumentando il parametro array.length, i nuovi valori inizieranno come non definiti. In realtà, le implementazioni di Javascript probabilmente ottimizzeranno la memoria dell'array e alcuni o tutti i valori indefiniti potrebbero non occupare memoria.
thomasrutter,

1
array.length non scorre su nulla, è solo un singolo numero.
thomasrutter,

1
Questa risposta non copre i casi in cui non è impostato un indice di array. new Array(1)[0] === undefinedma il valore è vuoto. [undefined][0] === undefinedma il valore è impostato; l'array ha un valore. L'unica perfetta risposta sta usando ino hasOwnProperty()- idx in arrayo array.hasOwnProperty(idx)--per questa risposta: stackoverflow.com/a/39171620/3120446
dx_over_dt

350

Non possiamo semplicemente fare questo:

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}

10
La domanda era su come verificare se esiste un indice specifico di un array o meno.
thomasrutter,

26
Farebbe if(arrayName.length) {...qualche differenza?
siannone,

10
Perché così tanti voti positivi? Questo chiaramente non risponde alla domanda.
algiogia,

10
if(arrayName.length) {...falliscenull
Ronnie Royston il

5
questo fallisce con il [undefined, undefined]quale è un array con lunghezza = 2.
Soldeplata Saketos

41

L'uso di solo .lengthnon è sicuro e causerà un errore in alcuni browser. Ecco una soluzione migliore:

if(array && array.length){   
   // not empty 
} else {
   // empty
}

oppure possiamo usare:

Object.keys(__array__).length

2
«Si noti che non si desidera verificare se l'intero array è vuoto, solo una determinata posizione che ha il valore di indice di" indice "»
Oriol

bella, breve e semplice risposta per coloro che vogliono controllare l'intero array
Luis Martins

23
if(!arrayName[index]){
     // do stuff
}

8
Questo farebbe anche cose se il valore dell'array esiste ma è 0, null, "", ecc.
thomasrutter,

Thomas ha ragione; tuttavia, questo è sufficiente per molti casi (che dovresti probabilmente enumerare).
Justin Johnson,

di gran lunga il modo più semplice
l'interrutore il

8
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}

@thomasrutter Sto riscontrando problemi nel trovare un modo per ottenere un elemento array non definito.
Rex M

Hmmm, funziona (myarray [1] = undefinedvariable)? O semplicemente (myarray [1] = undefined)?
thomasrutter,

@thomasrutter entrambi porterebbero un'eccezione, no? (undefinedvariable è undefined)
Rex M

1
Puoi testarlo tu stesso usando qualcosa come Firebug. In Javascript, la lettura del valore di una variabile non definita non genera un'eccezione, ma restituisce il valore non definito.
thomasrutter,

@thomasrutter ti sbagli nel tuo primo commento. x == nullsarà sempre vero solo per null o indefinito, nient'altro. Allo stesso modo, x != nullsarà vero per tutto ciò che non è né nullo né indefinito. A meno che non sia necessario cercare un indefinito, basta appoggiarsi alla bontà della conversione implicita.
Marcus Stade,

8

Approccio breve e universale

Se vuoi controllare qualsiasi array se ha valori falsy (come stringhe false, non definite, null o vuote) puoi semplicemente usare ogni metodo () come questo:

array.every(function(element) {return !!element;}); // returns true or false

Per esempio:

['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true

Se hai bisogno di ottenere un primo indice di valore falso, puoi farlo in questo modo:

let falsyIndex; 

if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
  console.log(falsyIndex);
} // logs 3

Se hai solo bisogno di controllare un valore errato di un array per un dato indice, puoi farlo in questo modo:

if (!!array[index]) {
  // array[index] is a correct value
}
else {
  // array[index] is a falsy value
}

6
if(typeof arr ==='object' && arr instanceof Array ){
   if(!arr.length){
      println 'empty'
   }else{
      printn 'not Empty'
   }

}else{
   println 'Null'
}

Se intendi con "Null" -> I suoi elementi sono nulli o uguali a "", in questo caso: controlla se l'array è vuoto dopo aver filtrato tutti gli elementi "null"

if(!arr.clean().length){return 'is null'}

Naturalmente, aggiungi il metodo Clean prima di:

Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}

5

Consiglierei di creare una funzione come questa:

function isEmptyEl(array, i) {
   return !(array[i]);
}

Potresti chiamarlo così:

if (isEmptyEl(arrayName, indexVal)) {
   console.log('arrayName[' + indexVal + '] is empty');
}

Forzare lo sviluppatore ad aderire all'interfaccia isEmptyEl rileverà errori di input come arrayName non definito o variabili indexVal.

(È generalmente buona norma programmare in modo difensivo durante la programmazione in Javascript.)

Si otterrebbe un errore generato in questo modo se arrayName non fosse definito:

Uncaught ReferenceError: arrayName is not defined
    at <anonymous>:2:15
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)

Risultati simili per un indexVal non definito.

Viene visualizzato un errore se i valori dell'array o dell'indice non esistono.

Per un input valido, otterrai un valore vero solo se arrayName [indexVal] è uno dei seguenti:

  • nullo
  • non definito
  • NaN
  • stringa vuota
  • 0
  • falso

5

Dipende da cosa intendi con "vuoto".

Quando si tenta di ottenere il valore di una proprietà su un oggetto che non ha proprietà con quel nome, si otterrà il valore undefined.

Questo è ciò che accade con gli array sparsi: non tutti gli indici tra 0ed array.length-1esistono.

Quindi puoi verificare se array[index] === undefined.

Tuttavia, la proprietà indexpotrebbe esistere con un undefinedvalore. Se si desidera filtrare questo caso, è possibile utilizzare l' inoperatore o hasOwnProperty, come descritto in Come posso verificare se un oggetto ha una proprietà in JavaScript?

index in array;
array.hasOwnProperty(index);

Se si desidera considerare una proprietà esistente con un valore undefinedo nullinesistente, è possibile utilizzare il confronto libero array[index] == undefinedo array[index] == null.

Se sai che l'array non è scarso, puoi confrontarlo indexcon array.length. Ma per sicurezza, potresti voler assicurarti che sia indexdavvero un indice di array, vedi Controlla se il nome della proprietà è indice di array


2
Questa è l'unica risposta che distingue correttamente tra gli elementi dell'array non impostati (che non hanno alcun valore) e gli elementi che sono impostati sul valore indefinito. I 2 stati sono offuscati dal fatto che l'accesso a un elemento dell'array non impostato restituisce un indefinito, ma sono diversi.
olivr,

Utilizzare hasOwnProperty quando si dispone di un array con valori potenzialmente non impostati (diversi da non definiti o nulli).
CMCDragonkai,

1

OK, vediamo prima cosa succederebbe se non esistesse un valore di array in JavaScript, quindi se abbiamo un array come di seguito:

const arr = [1, 2, 3, 4, 5];

e ora controlliamo se 6 è presente all'indice 5 oppure no:

arr[5];

e otteniamo undefined...

Quindi questo in sostanza ci dà la risposta, il modo migliore per verificare se non definito, quindi qualcosa del genere:

if("undefined" === typeof arrayName[index]) {
  //array value is not there...
}

È meglio NON farlo in questo caso:

if(!arrayName[index]) {
  //Don't check like this..
}

Perché immagina di avere questo array:

const arr = [0, 1, 2];

e facciamo:

if(!arr[0]) {
  //This get passed, because in JavaScript 0 is falsy
}

Quindi, come vedi, anche 0 è lì, non viene riconosciuto, ci sono poche altre cose che possono fare lo stesso e renderti buggy dell'applicazione, quindi fai attenzione, li elenco tutti sotto:

  1. undefined : se il valore non è definito ed èundefined
  2. null : se è null, ad esempio se un elemento DOM non esiste ...
  3. stringa vuota :''
  4. 0 : numero zero
  5. NaN : non un numero
  6. falso

1

Vorrei sottolineare qualcosa che alcuni sembrano aver perso: vale a dire che è possibile avere una posizione "vuota" dell'array nel mezzo dell'array. Considera quanto segue:

let arr = [0, 1, 2, 3, 4, 5]

delete arr[3]

console.log(arr)      // [0, 1, 2, empty, 4, 5]

console.log(arr[3])   // undefined

Il modo naturale di verificare sarebbe quindi vedere se il membro dell'array non è definito, non sono sicuro che esistano altri modi

if (arr[index] === undefined) {
  // member does not exist
}

0

provare questo se l'array [indice] è nullo

if (array[index] != null) 

0

Con Lodash puoi fare:

if(_.has(req,'documents')){
      if (req.documents.length)
      _.forEach(req.documents, function(document){
        records.push(document);
      });
} else {
}

if(_.has(req,'documents'))è verificare se il nostro oggetto richiesta ha una proprietà denominata documentse se ha quel prop, il prossimo if (req.documents.length)è di validare se non è un array vuoto, quindi le altre cose come forEachpossono essere proseguite.


0

Per verificare se non è mai stato definito o se è stato eliminato:

if(typeof arrayName[index]==="undefined"){
     //the index is not in the array
}

funziona anche con array associativi e array in cui è stato eliminato un certo indice

Per verificare se non è mai stato definito, è stato eliminato O è un valore nullo o logico vuoto (NaN, stringa vuota, falso):

if(typeof arrayName[index]==="undefined"||arrayName[index]){
     //the index is not defined or the value an empty value
}

0

Ho riscontrato questo problema utilizzando i database di laravel. Stavo memorizzando un valore JSON chiamato propertiesin un registro attività e volevo mostrare un pulsante basato sul fatto che questo valore era vuoto o meno.

Bene, i datatables lo interpretavano come un array se era vuoto e un oggetto se non fosse, quindi la seguente soluzione ha funzionato per me:

render: function (data, type, full) {
    if (full.properties.length !== 0) {
        // do stuff
    }
}

Un oggetto non ha una proprietà length.


0

Penso che questa decisione sia appropriata per i ragazzi che preferiscono la programmazione funzionale dichiarativa rispetto all'imperativo OOP o procedurale. Se la tua domanda è " Esistono dei valori all'interno? (Un valore di verità o di un falso)" puoi usare il .somemetodo per validare i valori al suo interno.

[].some(el => el || !el);
  • Non è perfetto, ma non richiede di applicare alcuna funzione aggiuntiva contenente la stessa logica, come function isEmpty(arr) { ... }.
  • Suona ancora meglio di "È lunghezza zero?" quando lo facciamo, il [].lengthrisultato 0è pericoloso in alcuni casi.
  • O anche questo [].length > 0detto "La sua lunghezza è maggiore di zero?"

Esempi avanzati:

[    ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true

-1

Puoi usare la libreria Loadsh per farlo in modo più efficiente, come:

se si dispone di un array denominato "animali domestici", ad esempio:

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });

Per controllare tutti i valori di array per valori nulli o non definiti:

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

Guarda altri esempi in http://underscorejs.org/


fn(){}è un errore di sintassi e non è affatto chiaro come ciò aiuti a verificare se esiste un elemento dell'array in un determinato indice o meno.
Oriol,
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.