2013-08-01 15 views
11

Ho una matrice di oggetti, in cui ogni oggetto ha una proprietà "figli" (dati di esempio di seguito). Voglio appiattire genitori/figli in un unico array, con ogni genitore immediatamente seguito dai suoi figli.Underscore per appiattire array nidificati di oggetti padre/figlio

ho scritto il seguente utilizzando lo-dash/sottolineatura, e funziona quando ho uno e un solo figlio per ciascun genitore:

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

So che posso usare qualcosa come _.each e costruisci un oggetto, chiediti solo se c'è un modo elegante per farlo usando _.

Esempio Dati:

[{ 
    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

Credo che volevi dire 'pluck' invece di' flatten' dentro lo zip? – Bergi

+0

http://lodash.com/docs#flatten - la versione abbreviata usa 'pluck', si –

risposta

19

Un modo semplice e più leggibile per fare questo è

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

Il risultato è

[{ 
    "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

Uscita non disponibile – Selva

+0

Non restituisce i bambini. – Ashwin

5

L'approccio comune per unire le matrici che modo si vogliono è quello di zip loro ed è possibile utilizzare pluck per estrarre i bambini. Qualcosa di simile a questo:

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

che vi lascerà con undefined voci in mangled se uno qualsiasi degli elementi di livello superiore di myArr non hanno children chiavi a tutti. Si può buttare in un compact di sbarazzarsi di quelli:

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

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

Naturalmente, facendo la mutilazione con aa paio for loop e alcuni push chiamate sarà probabilmente più veloce, ma la differenza di velocità shouldn Non importa con i corti array.

+0

In * mangled *, l'oggetto genitore contiene ancora il campo figli, come rimuoverlo? – zsong

+0

Probabilmente andrei con qualcosa come il tuo per quello. Nella vita reale probabilmente userei i cicli 'for' e' push' per appiattirlo e ripulirlo in un unico passaggio. Il problema (IMO) è che non abbiamo iteratori reali, quindi c'è un sacco di copia e costruttore di array che accade. –

+0

Potrei andare avanti e indietro su quale risposta è "corretta" - immagino che questo sia un po 'soggettivo. Dal momento che il tuo commento ha detto che avresti usato il suo, ho segnato la sua come risposta. Inoltre, hai una reputazione di 30x :) –

Problemi correlati