将平坦对象扩展到层次结构



我正在尝试找到扩展这种平坦结构的最佳方法

var input = [  
   {  
      "path":"/",
      "size":1111
   },
    {  
      "path":"/test1",
      "size":2222
   },
   {  
      "path":"/test1/folder2",
      "size":3333
   },
   {  
      "path":"/test1/folder2",
      "size":4444
   },
   {  
      "path":"/test7/folder1",
      "size":5555
   }
]

进入这个分层结构

var expectedoutput = [{
    "path": "/",
    "size": 1111
  },
  {
    "path": "/test1",
    "size": 2222,
    "items": [{
        "path": "/test1/folder2",
        "size": 3333,
      },
      {
        "path": "/test1/folder2",
        "size": 4444
      }
    ]
  },
  {
    "path": "/test7",
    "items": [{
      "path": "/test7/folder1",
      "size": 5555
    }]
  }
]

有什么想法吗?请。

不是那么糟糕的方法,它的工作是,但是有一种情况无法处理当父节点不存在时(应该创建)我评论了此部分。

更新的版本缺少中间路径支持

function expand_object(list) {
    var map = {}, node, roots = [], i;
    for (i = 0; i < list.length; i += 1) {
        map[list[i].path] = i; // map  
        list[i].items = []; // place for children
    }
    for (i = 0; i < list.length; i += 1) {
        node = list[i];
        //find parent, example  "path":"test1/folder2"  parent= "test1"
        var lastSlash = node.path.lastIndexOf('/');
        if (lastSlash > 1) {
            lastSlash = lastSlash == -1 ? node.path.length : lastSlash;
            parentNode = node.path.substring(0, lastSlash);
        }
        else {
            parentNode = "/";
        }
        if (parentNode !== "/") {
            // creat missing nodes
            if (!list[map[parentNode]]) {
                list.push({ "name": parentNode ,"path": parentNode, "items": [] })
                map[list[list.length-1].path] = list.length-1;
            }
            var c = list[map[parentNode]];
            list[map[parentNode]].items.push(node);

        } else {
            roots.push(node);
        }
    }
    return roots;
}
var input = [  
   {  
      "path":"/",
      "size":1111
   },
      {  
      "path":"/",
      "size":2222
   },
    {  
      "path":"/test1",
      "size":2222
   },
   {  
      "path":"/test1/folder2",
      "size":3333
   },
   {  
      "path":"/test1/folder2",
      "size":4444
   }
 ,
    { //Missing node
       "path":"/test7/folder1",
       "size":5555
    }
]
console.log(expand_object(input));

最新更新