2016-11-22 37 views
11

Bir kullanıcı komut dosyası geliştiricisi olduğumu ve sayfadaki javascript üzerinde kontrol sahibi olmadığımı varsayalım. Sayfa rastgele uzunluklara sahip diziler oluşturur ve bunları rastgele değerler ile doldurur (örneğin, undefined gibi falsy olanlar dahil). Her elemanın bir değer atanması gerekmez, bu yüzden boş yuvalar olabilir.Tanımsız dizi elemanları ve boş yuvalar nasıl söylenir?

bir basitleştirilmiş bir örnek (Firefox konsol): javascript onlar özdeş görünmektedir oysa

var arr = new Array(3); 
arr[0] = null; 
arr[1] = undefined; 
console.log(arr);    \\ Array [ null, undefined, <1 empty slot> ] 
console.log(arr[1]);   \\ undefined 
console.log(arr[2]);   \\ undefined 
console.log(arr[1] === arr[2]); \\ true 
console.log(typeof arr[1]);  \\ undefined 
console.log(typeof arr[2]);  \\ undefined 

Gördüğümüz gibi, Firefox farklı undefined ve boş yuva görüntüler.

Şimdi varsayalım ki böyle bir diziyi temizlemek, tüm boş yuvaları kaldırmak ama undefined öğelerini bozulmadan bırakmak istiyorum. Bunu nasıl yaparım?

+1

neyi boş yuva demektir? yeni bir dizi ister misin –

cevap

15

Dizinin bir anahtarı olup olmadığını kontrol etmek için in işlecini kullanabilirsiniz. Bu değerin undefined dahil değerlerle yuvaları boş yuvaları için yanlış, ama gerçek döndürür: Bunu kullanarak dizinin sonunun boş yuvaları ve alanlarının ayırt ama eğer edemez

var arr = new Array(3); 
arr[0] = null; 
arr[1] = undefined; 

1 in arr; // true 
2 in arr; // false 

Not dizinin uzunluğunu biliyorsunuz, o zaman zaten 3'un bir parçası olmadığını biliyorsunuz, bu yüzden 3 in arr'u test etmeniz gerekmez.

Ayrıca böyle boş yuva filtreleyebilirsiniz:

arr = arr.filter(function (_, i) { return i in arr }); 
+1

Vay, bu zekice. – Harangue

3

Sen seyrek dışına çıkarıldığı Array#forEach, kullanabilirsiniz.

var arr = new Array(3); 
 
arr[0] = null; 
 
arr[1] = undefined; 
 
console.log(arr); 
 

 
var withoutSparse = []; 
 

 
arr.forEach(function (a, i) { 
 
    console.log(i); 
 
    withoutSparse.push(a); 
 
}); 
 
console.log(withoutSparse);
.as-console-wrapper { max-height: 100% !important; top: 0; }