繁体   English   中英

Javascript-使用group by从对象数组创建树结构以定义子级

[英]Javascript - Create tree structure from array of objects using a group by to define children

我有一个对象数组,我想从中按属性分组以构建树结构。

objects = [object1, object2, object3, ... ]

对象示例:

object1 = {
           FolderName: "Folder1",  //group on this property
           NodeName: "Node1"
          }

我想通过FolderName属性对对象进行分组,以获得如下所示的树形结构:

treeData  = [
              {
                text: "Folder1",
                nodes: [
                          {
                            text: "Node1",
                          }
                        ]
              },
              { 
                text: "Folder2",
                nodes : [
                          {
                            text: "NodeX",
                          }
                        ]
              }
            ]

编辑:

我正在尝试使用这个groupBy函数,但是它返回一个数组数组。 因此,我使用for循环将其转换为所需的树形结构。 我得到了想要的结果,但是我徘徊着如何以更优化的方式实现它。

function groupBy(array, f) {
      var groups = {};
      array.forEach(function(o){
        var group = JSON.stringify(f(o));
        groups[group] = groups[group] || [];
        groups[group].push(o);
      });
      return Object.keys(groups).map(function(group){
        return groups[group]; 
      });
    }

var result = groupBy(objects, function(item){
    item.text = item.NodeName;
    return [item.FolderName];
});

var treeData = [];
for (i=0; i < result.length; i++) {
     treeData.push({ "text": result[i][0].FolderName, "nodes":result[i]});
}

尚未测试,但请尝试:

var treeData = [],
    folders = {};

objects.forEach(function(obj){
    if(obj.FolderName in folders)
        treeData[folders[obj.FolderName]].nodes.push({text:obj.NodeName});
    else 
        folders[obj.FolderName] = treeData.push({text: obj.FolderName, nodes: [{text:obj.NodeName}]}) - 1;
});

这个想法是在构建树数组时创建一个对象( folders ),该树数组将FolderName作为属性存储,并将FolderName被添加到treeData数组中的位置的treeData作为值。 在添加到树中时,您检查folder对象是否具有此属性,如果有,请将节点添加到以该值存储的对象的节点数组中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM