2013-08-01 14 views
11

Mam tablicę obiektów, gdzie każdy obiekt ma właściwość "dzieci" (przykładowe dane poniżej). Chcę spłaszczyć rodziców/dzieci w jedną tablicę, z każdym rodzicem zaraz po jego dzieciach.Podkreślenie, aby spłaszczyć zagnieżdżoną tablicę obiektów nadrzędnych/potomnych

Pisałem następujące używając lo desce rozdzielczej/podkreślenia, i to działa, kiedy mam jedno i tylko jedno dziecko dla każdego z rodziców:

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

wiem, że mogę użyć czegoś jak _.each i zbuduj obiekt, zastanawiając się, czy można to zrobić za pomocą _.

Przykład Dane:

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

Chyba chodziło 'pluck' zamiast' flatten' wewnątrz zip? – Bergi

+0

http://lodash.com/docs#flatten - skrócona wersja używa 'pluck', yes –

Odpowiedz

19

Prosty i czytelny sposób bardziej to zrobić

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

Rezultatem jest

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

Dane wyjściowe nie nadchodzą – Selva

+0

Nie zwraca dzieci. – Ashwin

5

Zwykłe podejście do łączenia tablic one tak, jak chcesz to zip je i można korzystać pluck wyodrębnić dzieci. Coś takiego:

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

To zostawię was z undefined wpisów w mangled jeśli któryś z elementów najwyższego poziomu myArr nie mają children klucze w ogóle. Można rzucać w compact aby pozbyć się tych:

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

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

Oczywiście, robi maglowania z AA kilka for pętli i niektórych push rozmów będzie prawdopodobnie szybciej, ale różnica prędkości powinnam ma znaczenie z krótkimi tablicami.

+0

W * zniekształconym *, obiekt nadrzędny nadal zawiera pole potomne, jak je usunąć? – zsong

+0

Prawdopodobnie pójdę z czymś podobnym do tego. W prawdziwym życiu prawdopodobnie użyłbym pętli 'for' i' push' do spłaszczenia i wyczyszczenia w jednym przejściu. Problem (IMO) polega na tym, że nie mamy prawdziwych iteratorów, więc jest mnóstwo konstruktorów kopiowania i macierzy. –

+0

Mógłbym iść tam iz powrotem, na której odpowiedź jest "poprawna" - myślę, że to jest trochę subiektywne. Ponieważ twój komentarz powiedział, że użyjesz jego, zaznaczyłem jego jako odpowiedź. Dodatkowo, masz 30x reputację :) –