【问题标题】:How can I build a hierarchy tree from flat data in JavaScript?如何从 JavaScript 中的平面数据构建层次结构树?
【发布时间】:2013-05-14 21:21:46
【问题描述】:

我有一个这样的 json 数据:

Data = [{"Id":"1", "Name":"abc", "Parent":""}, {"Id":"2", "Name":"abc", "Parent":"1"},
{"Id":"3", "Name":"abc", "Parent":"2"},{"Id":"4", "Name":"abc", "Parent":"2"}]

我想将这些数据转换成这样的层次结构树:

root: {
        Id:"1",
        Name:"abc", 
        Parent:"",
        0: {
            Id:"2",
            Name:"abc",
            Parent:"1",
             0:{
                Id:"3",
                Name:"abc",
                Parent:"2",
             1:{
                Id:"4",
                Name:"adb",
                Parent:"2",
.....
}

目前我的想法只是将其作为数组对象,但这种格式对我不起作用。因为我需要 sapui5 中 TreeTable 的这种格式。

感谢您的帮助。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您的 JSON 示例完全没有意义,因为您通常会有一些数组来保存子节点。但这里有一个应该很容易适应不同结构的例子。有优化的空间,一些循环可以组合在一起以获得更高效的代码。我将所有内容分解为不同的循环,以使代码更易于理解。当然还有其他方法,但这是一种:

    var data = [{"Id":"1", "Name":"abc", "Parent":""}, {"Id":"2", "Name":"abc", "Parent":"1"}, {"Id":"3", "Name":"abc", "Parent":"2"},{"Id":"4", "Name":"abc", "Parent":"2"}];
    
    // flatten to object with string keys that can be easily referenced later
    var flat = {};
    for (var i = 0; i < data.length; i++) {
      var key = 'id' + data[i].Id;
      flat[key] = data[i];
    }
    
    // add child container array to each node
    for (var i in flat) {
      flat[i].children = []; // add children container
    }
    
    // populate the child container arrays
    for (var i in flat) {
      var parentkey = 'id' + flat[i].Parent;
      if (flat[parentkey]) {
        flat[parentkey].children.push(flat[i]);
      }
    }
    
    // find the root nodes (no parent found) and create the hierarchy tree from them
    var root = [];
    for (var i in flat) {
      var parentkey = 'id' + flat[i].Parent;
      if (!flat[parentkey]) {
          root.push(flat[i]);
      }
    }
    
    // here it is!
    window.console.log(root);
    

    【讨论】:

    • 如果您从每个键中删除 'id'+,它将使代码更加简洁
    • 谢谢@yaku 我会看的
    • 添加了'id'+ 以避免任何混淆/意外类型转换为数字索引。与源格式一样,id 和 parent 值看起来像数字,但在技术上是字符串。但这可能不是完全必要的。
    • 有通用的方法吗?是否有任何标准方法可以让我传递父母和孩子的 ID,或者我真的必须像 yaku 那样通过编码来做到这一点?
    • 请记住,上面的答案使用了四个循环,因此可以改进。由于我找不到实现 O(n) 解决方案的 npm 模块,因此我创建了以下模块(单元测试,100% 代码覆盖,只有 0.5 kb 大小并且包括类型。也许它可以帮助某人:npmjs.com/package /performant-array-to-tree
    猜你喜欢
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2021-04-19
    • 1970-01-01
    • 2019-12-20
    相关资源
    最近更新 更多