2014-11-11 23 views
5

bu nesnelerin dizisi transforme amAlt çizgi: Düz nesneye nesne dizisi. Sihir nedir? Bu basit, düz nesneye</p> <pre><code>[ { first: { blah: 1, baz: 2 } }, { second: { foo: 1, bar: 2 } } ] </code></pre> <p>:

{ 
    first: { 
    blah: 1, 
    baz: 2 
    }, 
    second: { 
    foo: 1, 
    bar: 2 
    } 
} 

iki basit yolu vurgulamaya/LoDash kullanarak bunu yapmak için bulunan:

// Using reduce and extend 
_.reduce(myArray, _.extend) 

// Using assign and apply 
_.assign.apply(_, myArray); 

Tüm kod bir JSBin'de belgelenmiştir: http://jsbin.com/kovuhu/1/edit?js,console

Uygula/bind/ara/atama/azaltma/genişletme üzerine çok fazla belge okudum… Ama kafamı perdelerin arkasında gerçekte neler olduğunu anlayamıyorum.

biri bana bu tek gömlekleri de yerine sihirli hileler sırrı anlamaya yardımcı olabilir misiniz?

+0

Onlar mutasyon * olarak, kara büyü gerçekleştirmek * Lütfen nesnelerin ilk. '_.reduce (myArray, _. Olmalıydı.uzatmak, {}) '(genişletmek için ({}, myArray [0]), myArray [1])) – Bergi

cevap

2

reduce bir nesnedeki/bir dizideki özellikleri tüm değerleri alır ve aggregates them. Bu durumda extend,'a iletilir, yani a (her adımla birlikte taşınır) değerigeçirerek, b nesnesinin tüm özellikleriyle (her seferinde dizinizdeki bir değer) geçirilir. Bir astarınızda, alt çizgi reduce dizininizi, {} ile başlayan bir nesne ile başlar ve tüm dizi öğesi özelliklerini giriş diziniz boyunca yürürken bu nesneye aktarır.

var thing = {}; 
var deeparray = [{...}, {...}, {...}]; 
deeparray.forEach(function(v) { 
    Object.keys(v).forEach(function(k) { 
    thing[k] = v[k]; 
    } 
}); 
return thing; 

assign (not found in underscore) nesneleri dizisini alıp hepsini bir araya Ezici, aynı şeyi yapar: Düz JS yılında gibi bir şey olurdu. Bu tam anlamıyla yaptığı tek şey. apply kelime this o işlevi içinde ne anlama geldiğini "elle geçersiz kılma" ise bir işlevi çağırmak için JavaScript işlevi bir üs - _ this.assign(myArray) arayarak olarak çağrı _assign.apply(_, myArray) aynıdır. _.assign.apply(_,myArray)this lodash olacak ve bazı rasgele fonksiyon bağlamı kapsamlı değil ilave garanti hariç _.assing(myArray) çağrı ile aynıdır.

+0

Genişletmek için teşekkür ederim. Şimdi," azaltma "ve" uzatma "ile olanları elde ediyorum. _.assign (myArray) 'ın neden işe yaramayacağını tam olarak anlayamadığımı ve '' 'ile' bu'ı geçersiz kılmamız gerektiğinden emin değilim. Bunu genişletebilir misin? – Kaelig

+1

Bu işlev, dahili olarak farklı bir kapsamdan bağlıdır; bu nedenle, "apply" işlevini kullanmazsanız, "bu", kaynakta görebildiğim en üst düzey işlev kapsamını belirtir. –

4

Bunu anlamak için, en ata basit versiyonunu yapalım (takma ad uzatmak). Biz sadece kaynak dediğimiz bir argümanı kabul edeceğiz ve bunu sonucumuza ekleyeceğiz. azaltmak Şimdi Arayabileceğimiz

var a = { 
    first: { 
    blah: 1, 
    baz: 2 
    } 
} 

var b = { 
    second: { 
    foo: 1, 
    bar: 2 
    } 
} 

var input = [a, b]; 

:

assign(result, a); 
// assigns the (key, value) pair ("first", {blah: 1, baz: 2}) to result 

assign(result, b); 
// assigns the (key, value) pair ("second", {foo: 1, bar: 2}) to result 

Talk:

_.reduce(input, assign); 

iki kez atamak çağrısı yapacağı azaltmak Şimdi

function assign(result, source) { 

    var keys = Object.keys(source), 
    length = keys.length; 

    for (var i=0 ; i < length; i ++) { 
    var key = keys[i]; 
    result[key] = source[key]; 
    } 

    return result; 
} 

en parçalar halinde girişini yıkmasını ucuz, bana kodu göster: http://jsbin.com/hexiza/3/edit?js,console

Atama, Lo-Dash source code içinde createAssigner() ve baseAssign() kullanarak nasıl uygulandığını görebilirsiniz.

+0

Aynı şeyi yapmanın başka bir yolunu gösterdiği için teşekkürler Andrew (+ atama azaltmak). Örnek çok açık. – Kaelig

İlgili konular