2017-05-18 1 views
1

Ich muss alle "ID" und "Name" einer großen Sammlung, die ich habe. Ein Array ob Objekte, die ein Array mit Objekten (etc) haben.Karte tief in der Sammlung

Ich kann es nicht funktionieren, ohne manuelle Vorarbeit für so viele Ebenen zu tun, die ist hässlich.

Ich benutze Lodash, also wäre eine Lösung, die dies verwendet, schön.

Dies ist, wie die Sammlung wie folgt aussieht:

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

So muss es in Unterkategorien in jedem Array von Objekten suchen und ID und den Namen zu sammeln, so dass ich mit allen IDs Namen von allen Ebenen am Ende .

Danke.

Antwort

0

Es ist nicht notwendig, lodash für diesen Zweck zu verwenden. Eine einfache rekursive Funktion .reduce() Verwendung macht den Job für Sie

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

Wie oben, ist dies wahrscheinlich einfacher ist, mit nativer JavaScript zu tun, wie es rekursiv ist. Dies ist die gleiche Idee wie die vorherige Antwort, aber mit einigen coolen Features von ES6 (Destrukturierung, Restparameter, Pfeilfunktionen, Standardparameter), und es wird ein Verweis auf die Eltern-ID gespeichert, so dass Sie den Kategoriebaum bei Bedarf neu erstellen können .

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 }

Verwandte Themen