2017-04-07 25 views
0

フラットな配列からツリーを構築する際に問題が発生しています。親がサブカテゴリを配列として持つカテゴリ - >サブカテゴリツリーを構築しています。Javascript再帰ツリービルディング

[ 
    { 
    "id": 1 
    }, 
    { 
    "id": 5, 
    }, 
    { 
    "id": 2, 
    "parent_id": 1 
    }, 
    { 
    "id": 3, 
    "parent_id": 1 
    }, 
    { 
    "id": 42, 
    "parent_id": 5 
    }, 
    { 
    "id": 67, 
    "parent_id": 5 
    } 
] 

そして、これは私が結果を見るために必要なものです::

[ 
    { 
    "id":1, 
    "subcategories":[ 
     { 
     "id":2, 
     "parent_id":1 
     }, 
     { 
     "id":3, 
     "parent_id":1 
     } 
    ] 
    }, 
    { 
    "id":5, 
    "subcategories":[ 
     { 
     "id":42, 
     "parent_id":5 
     }, 
     { 
     "id":67, 
     "parent_id":5 
     } 
    ] 
    } 
] 

私は再帰的を検索することによって、再帰的にこれを行うにしようとしている。ここ

はフラットな配列は次のようになります。私が銃身の底に当たるまで、それを続けていますが、私は循環構造を得ています。 ...トラバースでPARENT_IDは、常に親のIDであることを任意のアイデア表示されます。

tree(passingInFlatObjectHere); 

function topLevel (data) { 
    let blob = []; 
    data.forEach((each) => { 
    if (!each.parent_id) { 
     blob.push(each); 
    } 
    }); 
    return blob; 
} 

function tree (data) { 
    let blob = topLevel(data).map(function (each) { 
    each.subcategories = traverse(data, each.id); 
    return each; 
    }); 
    return blob; 
} 

function traverse (data, parent_id) { 
    let blob = []; 
    if (!parent_id) { 
    return blob; 
    } 
    data.forEach((each) => { 
    if (each.id === parent_id) { 
     each.subcategories = traverse(data, each.id); 
     blob.push(each); 
    } 
    }); 
    return blob; 
} 

答えて

1

私はちょうどあなたがあなたの問題を解決する手助けしたくないだけでなく、あなたが最大限に活用を支援したいと思いますES6

すべてのtopLevel機能の第一は、これに書き換えることができます。

function topLevel(data) { 
    return data.filter(node => !node.parent_id); 
} 

ニートはそれではないでしょうか?私はまた、一貫性のためにわずかにtreeを変更することをお勧めしますが、もちろん文体です。

function tree(data) { 
    return topLevel(data).map(each => { 
    each.subcategories = traverse(data, each.id); 
    return each; 
    }); 
} 

これまでロジックは問題ありません。ただし、each.id === parent_idをチェックすると、traverseに1つが含まれます。このように、関数はidがparent_idのノードを検索します。明らかに間違い。あなたはeach.parent_id === parent_idが欲しかったです。

問題は解決しました。私があなたを気にするなら、読書をやめてください。しかし、あなたはまた、ここにfilterの利点を取ることができるし、その少し余分早期終了を除去するためにあなたの関数を書き換える:うわー

function traverse(data, parentId) { 
    const children = data.filter(each => each.parent_id === parentId); 
    children.forEach(child => { 
    child.subcategories = traverse(data, child.id); 
    }); 
    return children; 
} 
+0

の助けに感謝し、私にES6内のすべての素敵な新しい砂糖を示しました。 – Goodwin