2016-04-18 6 views
2

私は本当にこれを理解することができません。特定のノードの深い子であるcategory_idを平坦化しようとしています。Javascriptの深いネストされた子どもたちを平らにします

var categories = [{ 
    "category_id": "66", 
    "parent_id": "59" 
}, { 
    "category_id": "68", 
    "parent_id": "67", 
}, { 
    "category_id": "69", 
    "parent_id": "59" 
}, { 
    "category_id": "59", 
    "parent_id": "0", 
}, { 
    "category_id": "67", 
    "parent_id": "66" 
}, { 
    "category_id": "69", 
    "parent_id": "59" 
}]; 

または視覚的には:children(59)

function children(category) { 
    var children = []; 
    var getChild = function(curr_id) { 
     // how can I handle all of the cats, and not only the first one? 
     return _.first(_.filter(categories, { 
      'parent_id': String(curr_id) 
     })); 
    }; 

    var curr = category.category_id; 

    while (getChild(curr)) { 
     var child = getChild(curr).category_id; 
     children.push(child); 
     curr = child; 
    } 

    return children; 
} 

電流出力が['66', '67', '68']次のとおりです。

enter image description here

私が得た最も近いが見つかりました。最初の項目を再帰的にループすることでした。私はlodashを使用しています

function getChildren(id, categories) { 
    var children = []; 
    _.filter(categories, function(c) { 
    return c["parent_id"] === id; 
    }).forEach(function(c) { 
    children.push(c); 
    children = children.concat(getChildren(c.category_id, categories)); 
    }) 

    return children; 
} 

の予想される出力は、私がテストしていないが、それは動作するはず['66', '67', '68', '69']

+0

なぜ何かが再帰的になる必要がありますか?これはオブジェクトの単純な配列です。 –

+0

複数のレベルがあるので、私が何かを監督していない限り、私のparent_idは常に親に最も近いですか? – veksen

+1

だから、その親の下にあるすべてのノードを含む親からすべての子のIDが始まるようにしますか? –

答えて

1

です。

編集:私はそれをテストし、今はうまくいくはずです。プランナーを参照してください。https://plnkr.co/edit/pmENXRl0yoNnTczfbEnT?p=preview

ここでは、フィルタリングされたカテゴリを破棄することによって小さな最適化を行うことができます。

function getChildren(id, categories) { 
    var children = []; 
    var notMatching = []; 
    _.filter(categories, function(c) { 
    if(c["parent_id"] === id) 
     return true; 
    else 
     notMatching.push(c); 
    }).forEach(function(c) { 
    children.push(c); 
    children = children.concat(getChildren(c.category_id, notMatching)); 
    }) 

    return children; 
} 
関連する問題