我需要创建一个能够将平面对象转换为递归对象的函数。这是我的示例:我有平面数组:
var flatArray = [ { Description: "G", guid: "c8e63b35", parent: null, }, { Description: "Z", guid: "b1113b35", parent: "c8e63b35", }, { Description: "F", guid: "d2cc2233", parent: "b1113b35", }, { Description: "L", guid: "a24a3b1a", parent: null, }, { Description: "K", guid: "cd3b11caa", parent: "a24a3b1a", }, ]
结果应该是:
recursiveArray = [ { Description: "G", guid: "c8e63b35", parent: null, Children: [ { Description: "Z", guid: "b1113b35", parent: "c8e63b35", Children: [ { Description: "F", guid: "d2cc2233", parent: "b1113b35", } ] }, ] }, { Description: "L", guid: "a24a3b1a", parent: null, Children: [ { Description: "K", guid: "cd3b11caa", parent: "a24a3b1a", } } ]
请帮助我找到解决方法。一个有效的算法将不胜感激,因为我在理解如何正确执行此操作方面存在问题。在每种情况下,我都需要为递归结构中的选中元素找到一个特定的位置,并将其推入找到的子元素数组中。我认为这是愚蠢且低效的。有什么方法可以快速有效地做到这一点?
编辑:递归数组的格式错误。现在应该可以了。我的数组没有任何排序。
这个很好用,很容易阅读:
function flatToHierarchy (flat) { var roots = [] // things without parent // make them accessible by guid on this map var all = {} flat.forEach(function(item) { all[item.guid] = item }) // connect childrens to its parent, and split roots apart Object.keys(all).forEach(function (guid) { var item = all[guid] if (item.parent === null) { roots.push(item) } else if (item.parent in all) { var p = all[item.parent] if (!('Children' in p)) { p.Children = [] } p.Children.push(item) } }) // done! return roots }