Belirli bir dizi dizininde bir değerin olup olmadığını nasıl kontrol edebilirim?


521

Bu, "index" konumundaki bir değerin var olup olmadığını test etmek için mi işe yarar?

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

6
Tüm dizinin boş olup olmadığını kontrol etmek istemediğini, sadece "index" indeks değerine sahip belirli bir yeri kontrol etmeyi unutmayın
Ankur

Başlık, "Belirli bir dizi dizininde bir değer varsa JavaScript'te nasıl kontrol edebilirim" diyerek geliştirilebilir.
demisx

Yanıtlar:


738

Kavramsal olarak, JavaScript'teki diziler şu ana kadar array.lengtholan öğeler içerir . Dizin içeren bir dizi öğesi , arasında ve dahil ise dizinin bir parçası olarak tanımlanır . Eğer i bu aralıkta değilse dizide değildir.array[0]array[array.length - 1]ii0array.length - 1

Yani kavram gereği, diziler sıfırdan başlayarak ve maksimuma çıkacak şekilde doğrusaldır ve herhangi bir girdinin bulunmadığı bu aralıkta "boşluklar" oluşmasına yönelik herhangi bir mekanizma yoktur. Belirli bir konum dizininde bir değerin olup olmadığını öğrenmek için (burada dizin 0 veya pozitif bir tamsayıdır), kelimenin tam anlamıyla

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

Şimdi, kaputun altında, JavaScript motorları neredeyse kesinlikle dizi alanını doğrusal ve bitişik olarak ayırmayacaktır, çünkü dinamik bir dilde pek mantıklı olmaz ve belirli kodlar için verimsiz olur. Muhtemelen karma tablolar veya bazı karma stratejilerdir ve dizinin tanımlanmamış aralıkları muhtemelen kendi belleklerine ayrılmamıştır. Bununla birlikte, dilin array.length n dizilerini n üyesi olarak göstermek istediği JavaScript, 0 ile n - 1 olarak adlandırılır ve bu aralıktaki her şey dizinin bir parçasıdır.

Bununla birlikte, muhtemelen istediğiniz şey , bir dizideki bir değerin gerçekten tanımlanmış bir şey olup olmadığını bilmektir - yani değil undefined. Belki de tanımlı olup olmadığınınull bilmek istersiniz . Değerlerini hiç ayarlamadan bir diziye üye eklemek mümkündür: örneğin, array.lengthözelliği artırarak dizi değerleri eklerseniz yeni değerler olur undefined.

Belirli bir değerin anlamlı mı yoksa tanımlanmış mı olduğunu belirlemek. Bu, değil undefined veya null:

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

veya

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

İlginçtir, JavaScript'in karşılaştırma kuralları nedeniyle, son örneğim buna göre optimize edilebilir:

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

6
OP'nin ne tür bir dizi ile uğraştığını bilmesi büyük olasılıktır, ancak sadece bütünlük için: dizi benzeri nesneler de genellikle bir lengthözellik içerir , bu durumda sonraki iki örnek daha uygundur.
Justin Johnson

9
her zaman foo !== 'undefined' && foo !== nullsadece değiştirebilirsinizfoo != null
thinklinux

1
Dile göre @TheComposer JavaScript bir dizi büyüklüğü Array.length ile tanımlanır, ve dizi bütün elemanları ihtiva söylenir 0için array.length - 1. Yine de bu değerlerin hepsi tanımlanmış değerler olmayacaktır . Eğer bir dizi üyesinde delete anahtar sözcüğünü kullanırsanız, o üyeyi array.length parametresini artırarak bir diziyi genişletirseniz, yeni değerler tanımsız olarak başlar. Gerçekte, Javascript uygulamaları muhtemelen dizi depolama alanını optimize eder ve tanımlanmamış değerlerin bazıları veya tümü bellekte yer alamaz.
thomasrutter

1
array.length hiçbir şey üzerinde yineleme yapmaz, sadece tek bir sayıdır.
thomasrutter

1
Bu yanıt, bir dizi dizininin ayarlanmadığı durumları kapsamaz. new Array(1)[0] === undefinedancak değer boş. [undefined][0] === undefinedancak değer ayarlanmıştır; Dizi sahip bir değer. Sadece mükemmel cevap kullanıyor inya hasOwnProperty()- idx in arrayya array.hasOwnProperty(idx)bu cevabı --per: stackoverflow.com/a/39171620/3120446
dx_over_dt

350

Bunu sadece yapamaz mıyız:

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

10
Soru, bir dizinin belirli bir dizininin var olup olmadığını test etmekle ilgiliydi .
thomasrutter

26
Misiniz if(arrayName.length) {...herhangi bir fark?
siannone

10
Neden bu kadar çok oy veriyor? Bu açıkça soruya cevap vermiyor.
algiogia

10
if(arrayName.length) {...başarısıznull
Ronnie Royston

5
[undefined, undefined]uzunluğu = 2 olan bir dizi olan bu başarısız olur .
Soldeplata Saketos

41

Yalnızca kullanmak .lengthgüvenli değildir ve bazı tarayıcılarda hataya neden olur. İşte daha iyi bir çözüm:

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

veya şunları kullanabiliriz:

Object.keys(__array__).length

2
«Tüm dizinin boş olup olmadığını kontrol etmek istemediğini, sadece" index "indeks değerine sahip belirli bir yeri not edin»
Oriol

dizinin tamamını kontrol etmek isteyenler için güzel, kısa ve basit bir cevap
Luis Martins

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

8
Dizi değeri varsa ancak 0, null, "" vb.
İse

Thomas haklı; ancak, bu birçok vaka için yeterlidir (muhtemelen numaralandırmanız gerekir).
Justin Johnson

bugüne kadar en basit yolu
kırıcı

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

@thomasrutter undefined bir dizi öğesi ile mümkün olacak bir yol bulmakta sorun yaşıyorum.
Rex M

Hmmm, (myarray [1] = tanımlanamayan değişken) çalışıyor mu? Yoksa sadece (myarray [1] = tanımsız)?
thomasrutter

@homasrutter her ikisi de bir istisna yaratır, değil mi? (undefinedvariable undefined)
Rex M

1
Firebug gibi bir şey kullanarak kendiniz test edebilirsiniz. Javascript'te, tanımsız bir değişkenin değerini okumak bir istisna atmaz - tanımsız değeri döndürür.
thomasrutter

@homasrutter ilk yorumunda yanılıyorsun. x == nullsadece null veya undefined için geçerli olacak, başka bir şey olmayacak. Aynı şekilde, x != nullnull ya da undefined olmayan her şey için de geçerli olacaktır. Özellikle tanımsız olarak bakmanız gerekmedikçe, örtük dönüşüm iyiliğine yaslanın.
Marcus Stade

8

Kısa ve evrensel yaklaşım

Herhangi bir diziyi yanlış değerleri (false, undefined, null veya empty string gibi) olup olmadığını kontrol etmek isterseniz, aşağıdaki gibi her () yöntemi kullanabilirsiniz :

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

Örneğin:

['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

Bir falsy değerinin ilk dizinini almanız gerekiyorsa, bunu şu şekilde yapabilirsiniz:

let falsyIndex; 

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

Belirli bir dizin için bir dizinin sahte bir değerini kontrol etmeniz gerekiyorsa, bunu şu şekilde yapabilirsiniz:

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'
}

'Null' -> öğelerini null veya '' değerine eşitlerseniz, bu durumda: Tüm 'null' öğeleri filtreledikten sonra dizinin boş olup olmadığını kontrol edin

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

Tabii ki, önce Temiz yöntemi ekleyin :

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

5

Bunun gibi bir işlev oluşturmanızı tavsiye ederim:

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

Buna şöyle diyebilirsiniz:

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

Geliştiriciyi isEmptyEl arabirimine uymaya zorlamak, tanımlanmamış bir diziAdı veya indexVal değişkenleri gibi giriş hatalarını yakalar.

(Javascript'te programlama yaparken defalarca programlamak genellikle iyi bir uygulamadır.)

DiziAdı tanımlanmadıysa şöyle bir hata mesajı alırsınız:

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)

Tanımlanmamış bir dizin için benzer sonuçlar

Dizi veya dizin değerleri yoksa bir hata iletisi alırsınız.

Geçerli giriş için, yalnızca arrayName [indexVal] aşağıdakilerden herhangi biri ise doğru olur:

  • boş
  • Tanımsız
  • NaN
  • boş dize
  • 0
  • yanlış

5

"Boş" ile ne demek istediğinize bağlıdır.

Bu ada sahip bir özelliği olmayan bir nesnede bir özelliğin değerini almaya çalıştığınızda, değeri alırsınız undefined.

Seyrek dizilerle olan budur: arasındaki 0ve array.length-1mevcut olan tüm indeksler değildir .

Böylece olup olmadığını kontrol edebilirsiniz array[index] === undefined.

Ancak, özellik indexbir undefineddeğerle var olabilir . Bu durumu filtrelemek istiyorsanız, inişleci veya bir nesnenin JavaScript'te bir özelliği olup olmadığını nasıl kontrol edebilirim? BölümündehasOwnProperty açıklandığı gibi kullanabilirsiniz.

index in array;
array.hasOwnProperty(index);

undefinedVeya nulldeğeri olan varolan bir mülkün mevcut olmadığını düşünüyorsanız, gevşek karşılaştırmayı array[index] == undefinedveya kullanabilirsiniz array[index] == null.

Dizinin seyrek olmadığını biliyorsanız, indexile karşılaştırabilirsiniz array.length. Ancak güvenli olmak için, indexgerçekten bir dizi dizini olduğundan emin olmak isteyebilirsiniz , bkz. Özellik adının dizi dizini olup olmadığını kontrol etme


2
Bu, ayarlanmamış dizi öğeleri (herhangi bir değeri olmayan) ile tanımlanmamış değere ayarlanmış öğeler arasında düzgün bir şekilde ayrım yapan tek yanıttır. 2 durum, ayarlanmamış bir dizi öğesine erişmenin tanımsız döndüğü gerçeğiyle bulanıklaşır, ancak bunlar farklıdır.
olivr

Potansiyel olarak ayarlanmamış değerlere sahip bir diziniz varsa (tanımsız veya null değerinden farklı) hasOwnProperty öğesini kullanın.
CMCDragonkai

1

Tamam, önce JavaScript'te bir dizi değeri yoksa ne olacağını görelim, bu yüzden aşağıdaki gibi bir dizimiz varsa:

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

ve şimdi 6'nın indeks 5'te olup olmadığını kontrol ediyoruz :

arr[5];

ve anlıyoruz undefined...

Bu temelde bize cevap, tanımsız olup olmadığını kontrol etmenin en iyi yolu , bu yüzden böyle bir şey:

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

Bu durumda bunu YAPMAMAK daha iyidir :

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

Çünkü şu diziye sahip olduğumuzu hayal edin:

const arr = [0, 1, 2];

ve yapıyoruz:

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

Gördüğünüz gibi, 0 bile var, tanınmıyor, aynı şeyi yapabilen ve uygulama buggy yapabileceğiniz başka şeyler var, bu yüzden dikkatli olun, hepsini listeliyorum:

  1. undefined : değer tanımlanmamışsa veundefined
  2. null : boşsa, örneğin bir DOM öğesi yoksa ...
  3. boş dize :''
  4. 0 : sıfır sayısı
  5. NaN : sayı değil
  6. yanlış

1

Ben birkaç kaçırmış gibi görünüyor bir şey işaret etmek istiyorum: yani dizinin ortasında "boş" bir dizi pozisyon olması mümkündür. Aşağıdakileri göz önünde bulundur:

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

Daha sonra kontrol etmenin doğal yolu dizi üyesinin tanımsız olup olmadığını görmek olacaktır, başka yollar varsa emin değilim

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

0

dizi [index] boşsa bunu deneyin

if (array[index] != null) 

0

Lodash ile şunları yapabilirsiniz:

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

if(_.has(req,'documents'))istek nesnemizin adlı bir özelliğe sahip olup olmadığını kontrol etmek documentsve bu pervane varsa, bir sonraki if (req.documents.length), boş bir dizi değilse doğrulamaktır, böylece benzeri diğer şeyler forEachdevam edebilir.


0

Daha önce tanımlanmadığını veya silinip silinmediğini kontrol etmek için:

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

ayrıca bazı dizini sildiğiniz ilişkilendirilebilir diziler ve dizilerle de çalışır

Hiçbir zaman tanımlanıp tanımlanmadığını kontrol etmek için VEYA boş veya mantıksal bir boş değerdir (NaN, boş dize, yanlış):

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

0

Laravel datatables kullanarak bu sorunla karşılaştım. propertiesBir etkinlik günlüğünde çağrılan bir JSON değeri saklıyordu ve bu değerin boş olup olmamasına dayalı bir düğme göstermek istedim.

Datatables bunu boşsa bir dizi ve eğer değilse bir nesne olarak yorumluyordu, bu nedenle aşağıdaki çözüm benim için çalıştı:

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

Bir nesnenin length özelliği yoktur.


0

Bu kararın, zorunlu OOP veya prosedür yerine bildirimsel fonksiyonel programlamayı tercih eden erkekler için uygun olduğunu düşünüyorum. Sorunuz " İçeride bazı değerler var mı? (Doğruluk mu yoksa yanlış bir değer mi)".some ise, içindeki değerleri doğrulamak için yöntemi kullanabilirsiniz .

[].some(el => el || !el);
  • Mükemmel değil ancak aynı mantığı içeren herhangi bir ekstra fonksiyonun uygulanmasını gerektirmez function isEmpty(arr) { ... }.
  • Hala "Sıfır uzunluk mu?" biz bunu yaparken [].lengthsonuçlanımını için 0hangi bazı durumlarda tehlikelidir.
  • Hatta bu [].length > 0deyiş "sıfırdan uzunluğu üzerinde mi?"

Gelişmiş örnekler:

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

-1

Bunu daha verimli yapmak için Loadsh kütüphanesini kullanabilirsiniz, örneğin:

"evcil hayvanlar" adında bir diziniz varsa, örneğin:

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) ) });

Tüm dizi değerlerini null veya undefined değerleri olup olmadığını denetlemek için:

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>

Http://underscorejs.org/ adresinde daha fazla örneği inceleyin


fn(){}sözdizimi hatasıdır ve bunun bir dizi öğesinin belirli bir dizinde var olup olmadığını kontrol etmeye nasıl yardımcı olduğu açık değildir.
Oriol
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.