2013-08-01 10 views
11

Her nesnenin bir "alt öğe" özelliğine sahip olduğu bir nesne dizim var (aşağıdaki örnek veriler). Ebeveynleri/çocukları tek bir diziye oturtmak istiyorum, her ebeveynin hemen ardından çocukları var.Ana/alt nesnelerin iç içe geçmiş dizisini düzleştirme konusunda bilgi edinin

kullanıyorum şu lo-çizgi/alt çizgi yazdım, ben her ebeveyn için sadece ve sadece bir çocuk sahibi olduğunda çalışır:

_.flatten(_.zip(myArr, _.flatten(myArr, "children"))) 

ben _.each gibi bir şey kullanabilirsiniz biliyoruz ve bir nesne oluşturmak, sadece bunu kullanarak snazzy bir yol olup olmadığını merak ediyorum.

Örnek Verileri:

[{ 
    name: "Some Name", 
    value: 1234, 
    children: [{ 
     name: "Another name", 
     value: 3456 
    }, { 
     name: "A third name", 
     value: 9876 
    }] 
}, { 
    name: "Omg Lazer Guns", 
    value: 3333, 
    children: [{ 
     name: "PewPewPew", 
     value: 4444 
    }] 
}]; 
+0

olduğunu

var list = []; _.each(data, function(item){ list.push(_.omit(item, 'children')); list.push(_.flatten(_.pick(item, 'children'))); }); var result = _.flatten(list); 

mı? – Bergi

+0

http://lodash.com/docs#flatten - shorthand sürümü 'pluck' kullanır, yes –

cevap

19

Bunu yapmak için basit ve daha anlaşılabilir bir yol sana pluck` yerine zip içindeki `flatten` ait` ettiğinizi tahmin sonuç

[{ 
    "name": "Some Name", 
    "value": 1234 
}, { 
    "name": "Another name", 
    "value": 3456 
}, { 
    "name": "A third name", 
    "value": 9876 
}, { 
    "name": "Omg Lazer Guns", 
    "value": 3333 
}, { 
    "name": "PewPewPew", 
    "value": 4444 
}] 
+1

Çıkış – Selva

+0

geliyor değil Çocukları döndürmez. – Ashwin

5

zamanki yaklaşım onlar yolu istediğiniz diziler birleştirmek zip onları ve Çocukları ayıklamak için pluck kullanabilirsiniz. Böyle bir şey:

var mangled = _(myArr).chain() 
         .zip(_(myArr).pluck('children')) 
         .flatten() 
         .value() 

myArr üst düzey elemanlarının herhangi birinde tüm children anahtarları yoksa mangled yılında undefined girdileri ile yalnız bırakacaktır. Onlardan kurtulmak için bir compact atabilir:

var mangled = _(myArr).chain() 
         .zip(_(myArr).pluck('children')) 
         .flatten() 
         .compact() 
         .value() 

Demo: http://jsfiddle.net/ambiguous/aeS86/ Tabii

, muhtemelen daha hızlı olacaktır aa çift for döngüler ve bazı push çağrıları ile bozma yapıyor ama hız farkı olmamalı kısa dizilerle ilgili.

+0

In * mangled *, ana nesne hala çocuk alanı, nasıl kaldırılır? – zsong

+0

Bunun için muhtemelen seninki gibi bir şeyle giderim. Gerçek hayatta muhtemelen 'for' döngülerini ve' push'i kullanarak tek geçişte düzleştirip temizlemeyi tercih ederim. Sorun (IMO), gerçek yineleyicimiz olmadığından, gerçekleşen bir dizi kopyalama ve dizi yapıcısı var. –

+0

Hangi cevabın "doğru" olduğuna dair ileri geri gidebilirim - sanırım bu biraz özneldir. Yorumun onu kullanacağını söylediğinden, onun cevabını işaretledim. Ayrıca, 30x itibarı var :) –

İlgili konular