2013-08-01 4 views
11

각 개체의 자식 속성 (아래 예제 데이터)이있는 개체 배열이 있습니다. 나는 부모/자식들을 하나의 배열로 평평하게하고 싶다.부모/자식 개체의 중첩 된 배열을 평평하게하기위한 밑줄

나는 사용하여 다음 LO-대시/밑줄을 서면으로 작성했습니다, 나는 각 부모에 대한 하나 하나의 아이가있을 때 작동 :

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

을 내가 _.each 같은 것을 사용할 수 있습니다 알고 _을 사용하여 이것을 수행하는 멋진 방법이 있는지 궁금해하는 객체를 작성하십시오.

예 데이터 :

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

입니다

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

입니까? – Bergi

+0

http://lodash.com/docs#flatten - 속기 버전은'pluck'를 사용합니다. 예 –

답변

19

이 작업을 수행 할 수있는 간단하고 더 읽기 방법은 당신이 pluck` 대신 내부 지퍼`flatten`의`의미 추측 결과는

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

출력이 나오지 않습니다. – Selva

+0

자식을 반환하지 않습니다. – Ashwin

5

일반적인 접근 방식은 그들이 방법은 당신이 원하는 배열을 병합은 zip에 그리고 당신은 아이들을 추출 pluck를 사용할 수 있습니다. 이런 식으로 뭔가 :

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

myArr의 최상위 요소 중 하나가 모든 children 키가없는 경우 mangledundefined 항목이 당신을 떠날 것입니다. 당신은 그 없애 compact에 던질 수 :

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

데모 : http://jsfiddle.net/ambiguous/aeS86/ 물론

, 아마 빨라집니다 aa는 몇 for 루프와 일부 push 통화와 맹 글링을하고 있지만, 속도 차이는 shouldn 짧은 배열로는 문제가 없습니다.

+0

* mangled *에서 부모 개체는 여전히 자식 필드를 포함하고 있습니다. 어떻게 제거합니까? – zsong

+0

나는 아마도 너와 비슷한 것으로 갈 것이다. 실생활에서 나는'for '루프를 사용하고 한 번에 그 패스를 평평하게하고 정리하기 위해'push'할 것입니다. 문제 (IMO)는 실제 반복자가 없으므로 복사 및 배열 생성자가 많이 발생한다는 것입니다. –

+0

나는 답이 "정확하다"고 앞뒤로 갈 수있다 - 나는 이것이 조금 주관적인 것 같아. 당신의 코멘트가 당신이 그의 것을 사용할 것이라고 말했기 때문에 나는 그의 대답으로 표시했습니다. 게다가, 당신은 30x 평판을 가지고 :) –

관련 문제