2017-05-18 6 views
1

큰 컬렉션의 모든 "id"와 "name"을 가져와야합니다. 배열 ob 객체, 객체가있는 배열 등 (기타).지도가 깊은 컬렉션

나는 수동으로하지 않고 일할 수 없다. 거기에는 많은 수준의 추악한 것들이있다.

나는 Lodash를 사용하고 있으므로이 솔루션을 사용하면 멋질 것입니다.

[ 
    { 
    "id": 1, 
    "name": "Living", 
    "numberStories": 0, 
    "subcategories": { 
     "data": [ 
     { 
      "id": 2, 
      "name": "Fashion", 
      "numberStories": 0, 
      "subcategories": { 
      "data": [ 
       { 
       "id": 3, 
       "name": "Accessories", 
       "numberStories": 0, 
       "subcategories": { 
        "data": [ 

        ] 
       } 
       }, 
       { 
       "id": 4, 
       "name": "Kid's Fashion", 
       "numberStories": 0, 
       "subcategories": { 
        "data": [ 

        ] 
       } 
       }, (... etc) 

그래서 나는 모든 수준에서 모든 식별자 이름으로 끝낼 수 있도록, 각 객체 배열의 하위 범주로보고 ID와 이름을 수집 할 필요가 :

이 같은 컬렉션 모습입니다 .

감사합니다.

답변

0

이렇게하려면 로다시를 사용할 필요가 없습니다. .reduce()를 사용하여 간단한 재귀 함수는

function flattenId(inArray){ 
return inArray.reduce(function(output, elem){ 
    output.push(elem.id); 
    return output.concat(flattenId(elem.subcategories.data)); 
    }, []); 
} 
1

은 위와 같이,이는 재귀의 네이티브 자바 스크립트로 할 아마 쉽게 당신을 위해 일을한다. 이것은 이전 답변과 같은 아이디어이지만 ES6의 멋진 기능 (구조, 나머지 매개 변수, 화살표 함수, 기본 매개 변수)을 사용하고 부모 ID에 대한 참조를 저장하므로 필요한 경우 카테고리 트리를 다시 작성할 수 있습니다 .

const categories=[{id:1,name:"Living",numberStories:0,subcategories:{data:[{id:2,name:"Fashion",numberStories:0,subcategories:{data:[{id:3,name:"Accessories",numberStories:0,subcategories:{data:[]}},{id:4,name:"Kid's Fashion",numberStories:0,subcategories:{data:[]}}]}}]}}]; 
 

 
const flattenCategories = (categories, parent = null, ret = []) => 
 
    categories.reduce((acc, { id, name, subcategories: { data } }) => 
 
    acc.concat(
 
     { id, name, parent }, 
 
     ...flattenCategories(data, id) 
 
    ) 
 
    , ret) 
 

 

 
console.log(
 
    flattenCategories(categories) 
 
)
.as-console-wrapper { top: 0; max-height: 100% !important }