2014-12-23 20 views
41

Dizininiz gibi olduğunu düşündüğünüz bir Javascript var ES6 İlerlemiş olduğunuzu önceden bildiğiniz uzunluğa sahip olacaksınız, bunu bir Javascript Dizisine dönüştürmenin en iyi yolu nedir? ES6 Dönüşünü Ardışık Şekilde Dönüştürme

bunu yaparken nedeni

böyle alt çizgi ve bir iterable üzerindeki herhangi bir işlevi kullanmak istiyorsanız, bu yüzden sadece destek Dizileri lodash gibi birçok js kütüphaneleri, ilk dizi için dönüştürülmesi gerekir olmasıdır.

Python'da liste() işlevini kullanabilirsiniz. ES6'da bir eşdeğer var mı?

+13

'Array.from (iterable) ', bakınız [*, ECMA-262 ed 6 taslak *] (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from). – RobG

cevap

8

ES6'ya eklenen Array.from yöntemini kullanabilirsiniz, ancak yalnızca Haritalar ve Kümeler gibi dizileri ve yinelenen nesneleri destekler (ES6'da da gelir). Düzenli nesneler için, her iki kütüphanenin yalnızca diziler için değil, nesneler için büyük desteği olduğundan, Underscore'un toArray yöntemini veya lodash'ın toArray yöntemini kullanabilirsiniz. Zaten alt çizgi veya lodash kullanıyorsanız, neyse ki, sizin için problemi çözebilir, harita gibi çeşitli işlevsel kavramları ekleyebilir ve nesneleriniz için küçültebilirler.

68

Array.from veya spread operator'u kullanabilirsiniz.

Örnek:

let s = new Set(); 
s.add(1); 
s.add(2); 
s.add(3); 
s.add(4); 

let a = Array.from(s); // = [ 1, 2, 3, 4 ] 

let b = [...s];  // = [ 1, 2, 3, 4 ] 
+2

Neredeyse aynı, ES6 'let m = yeni Map()' veri yapısı için de geçerlidir: sadece Harita değerlerini elde etmek için, Array.from' işlevini kullanın ya da m.values ​​() üzerindeki yayıcı operatörü kullanın; .keys() '. Aksi takdirde, bir dizi diziyi alırsınız: '[[anahtar, değer], [anahtar, değer]]'. –

-4

Ayrıca yapabilirdi:

let arr = []; 
for (let elem of gen(...)){ 
    arr.push(elem); 
} 

Ya da "zor yoldan" ES5 + jeneratör fonksiyonunu (şimdiki Firefox'ta Fiddle işleri) kullanarak:

var squares = function*(n){ 
    for (var i=0; i<n; i++){ 
     yield i*i; 
    } 
} 

var arr = []; 
var gen = squares(10); 
var g; 
while(true){ 
    g = gen.next(); 
    if (g.done){ 
     break; 
    } 
    arr.push(g.value); 
} 

Her ikisi de yaklaşımlar kesinlikle tavsiye edilmez ve sadece bir kavram kanıtıdır.