2017-05-18 4 views
1

私は持っている大きなコレクションの "id"と "name"をすべて取得する必要があります。配列obオブジェクト。オブジェクトなどの配列を持ちます。深くコレクション

私はそれが醜いですが、そこに多くのレベルのforeachを手動で行うことなく動作させることはできません。

私はLodashを使用していますので、これを使用する解決策は素敵です。

これは、コレクションはどのように見えるかです:私はすべてのレベルからすべてのIDの名前で終わるように、そう、それは、オブジェクトの各配列で、サブカテゴリに見て、IDと名前を収集する必要がある

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

ありがとうございました。

答えて

0

この目的のためにロダッシュを使う必要はありません。 .reduce()を使用した簡単な再帰関数は

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

は、上記のように、これはそれが再帰的だとしてネイティブJavaScriptで行うことが、おそらく簡単です、あなたのために仕事をしていません。これは前の解答と同じですが、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 }

関連する問題