javascript - 如何从 JavaScript 中的平面数据构建层次结构树?

标签 javascript

我有一个这样的 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",
.....
}

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

感谢您的帮助。

最佳答案

您的 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);

关于javascript - 如何从 JavaScript 中的平面数据构建层次结构树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16553072/

相关文章:

javascript - 获取函数的变量值而不全局设置它

javascript - 选择轴使用CSS翻转一个div

javascript - 数字和数字对象有什么区别?

javascript - Backbone、require.js 和 Youtube Javascript API

javascript - 谷歌应用程序脚本 : Copy and Paste Formulas Only

javascript - 当我拖动对象 CSS/JavaScript/AngularJS 时,为 css 类赋值

javascript - pimcore后端白屏registerNS错误

javascript - 滚动然后在更大的屏幕尺寸上修复 div 跳转

javascript - 在谷歌图表中使用日期时间作为 X 轴上的值

javascript - 如何将 AdWords 转化跟踪代码添加到 drupal 中的特定表单