2016-04-09 31 views
2

Bir dizi veya nesne arasında doğru bir şekilde dönecek genel bir döngü oluşturmak için herhangi bir yol var mı? Döngü için aşağıdakileri yazabileceğimi biliyorum, ancak bir diziye eklenecek diğer özellikler arasında da dönecektir.Javascript Döngü için Genel

for (item in x) { 
    console.log(item) 
} 

bu derken yineleme olacak döngüsü için bir anlamı:

x = [1, 2] 
x.foo = "foo" 
y = {first:1, second: 2} 

x

1 
2 

y

first 
second 

kadar

arkasındaki neden olduğunu ben çalışma zamanına kadar ne olacağını bilmiyorum x (ne bir Dizi veya Nesne). Çalışma zamanında kontrol edecek bir işlev oluşturmak için tek seçeneğim var mı?

+2

Eğer uğraşıyoruz ne tür bilmiyorsanız, size uğraşıyoruz türünü bilmek bir yerime koy çalışmalıdır. İşçi tarafından adam öldürmeyi önlemenin en kolay yolu. –

+0

Yorumunuza kesinlikle katılıyorum. Berraklık her zaman istenir. Belirsizliğin sebebi, Javascript'i derleyen dinamik bir dil için bir derleyici yazıyorum. Bu nedenle, döngü kaynağının ne tür olduğunu bilmek zorunda değilim, bu yüzden çalışma zamanında çalışacak bir for döngüsü oluşturmanın genel bir yoluna ihtiyacım vardı. – cbillingham

+0

JS'de her şey bir Nesne'dir. Bu yüzden sizin durumunuzda dizileri işlemek ve hatta nesneler olarak işlev görmek daha akıllıca olabilir çünkü gerçek bir fark yoktur. Yukarıdaki örnekte 'x = [1, 2]; x.foo = "foo"; 'Object.keys (x) '[" 0 "," 1 "," foo "]' yi listeleyecektir, ancak size numaralandırılamayan "length" özelliğini gösterecektir. Bazı durumlarda 'Object.getOwnPropertyNames (x); 'i kullanmayı tercih edebilirsiniz ve bu sayılar, sayısız oldukları veya" ["0", "1", "length", "foo"] 'gibi değillerse, kendi özelliklerine dönecektir. – Redu

cevap

3

for..of loop'u kullanın.

const object = { 
    some: "string", 
    number: 42 
}; 
for (const [key, value] of Object.entries(object)) { 
    console.log(key, value); 
} 

Neyse nesnelerin üzerine diziler

const array = [1, 2]; 
array.foo = "test"; 
for (const number of array) { 
    console.log(number); // skips array.foo 
} 

Yineleme üzerinde

yineleme, bir bakış kodu stilindeki noktadan, hala üzerinde yineleme önce nesne bir dizi olup olmadığını kontrol etmelidir . Bunu elde etmek için Array.isArray'u kullanabilirsiniz.

if (Array.isArray(data)) { 
    for (const element of data) { 
     // Iterate over array 
    } 
} 
else { 
    for (const [key, value] of Object.entries(data)) { 
     // Iterate over object 
    } 
} 

Jenerik döngü JavaScript, typeof [] === "object" yılında bu yana

(yani diziler onun anahtar olarak öğenin dizinini kullanırız nesnelerdir), aşağıda belirtilen yerlere azaltabilecek: Yani data varsayarak bir nesne veya dizi olduğunu Object.entries ile tek döngü:

for (const [key, value] of Object.entries(data)) { 
    // For arrays, `key` will be the index 
} 

o ama dikkat dinamik özelliklerinin sizin dışlanma adalet yapmayacağım bu sonuncu yöntem (Örn. g. Object.entries sonucu üzerinde yinelediğiniz gibi, array.foo). numaralı belgenin bunu yapması gerekiyorsa, yukarıdaki gibi Array.isArray ile iki for..of döngüyü kullanın.

0

Sadece beklenen çıktıya göre gereksinim duyduğunuz dizin/anahtar değerleri iseniz, basit bir tek liner.

function loop(x) { 
    return (Array.isArray(x) ? x : Object.keys(x)).forEach(el => console.log(el)); 
} 

loop(x); // 1 2 
loop(y); // First Second 

DEMO