javascript - 从平面数组创建树对象

标签 javascript

我对此有点困惑。我想从平面数组创建树结构。假设我有这个输入:

var input = [
    ["a","b","c"],
    ["a", "b","d"],
    ["e","f","g"],
];

我想创建一个如下所示的树结构:

// output:
[
    {
        id: "a",
        children: [
            {id: "b", children: [
                {id: "c", children: []},
                {id: "d", children: []}
            ]},
        ] 
    },
    { 
        id: "e",
        children: [
          {
              id: "f",
              children: [{ id: "g", children: []}]
          },
        ]
    }
]

我想到的一种方法是拥有所有父级的映射,并迭代输入数组以设置父级到子级的映射。但是当我尝试从该 map 实际构造树对象并避免重复时,我遇到了问题。感谢任何指点,谢谢!

最佳答案

我找到了与您的问题类似的问题的解决方案。

_makeTree

如果您有如下所示的数据:

_makeTree({ q:
    [
        {"id": 123, "parentid": 0, "name": "Mammals"},
        {"id": 456, "parentid": 123, "name": "Dogs"},
        {"id": 214, "parentid": 456, "name": "Labradors"},
        {"id": 810, "parentid": 456, "name": "Pugs"},
        {"id": 919, "parentid": 456, "name": "Terriers"}
    ]
});

参数:

  • q(数组):查询结果(参见下面的示例)
  • id(字符串):id 列的名称(默认值:“id”)
  • parentid(字符串):ParentItemID 列的名称(默认值:“parentid”)
  • children(字符串):要在具有子项的行中创建的“children”数组的名称(默认值:“children”)

那么结果应该类似于以下结构:

[
    {
        "id": 123,
        "parentid": 0,
        "name": "Mammals",
        "children": [
            {
                "id": 456,
                "parentid": 123,
                "name": "Dogs",
                "children": [
                    {
                        "id": 214,
                        "parentid": 456,
                        "name": "Labradors"
                    },
                    {
                        "id": 810,
                        "parentid": 456,
                        "name": "Pugs"
                    },
                    {
                        "id": 919,
                        "parentid": 456,
                        "name": "Terriers"
                    }
                ]
            }
        ]
    }
]

现在, _makeTree 代码:

var _makeTree = function(options) {
  var children, e, id, o, pid, temp, _i, _len, _ref;
  id = options.id || "id";
  pid = options.parentid || "parentid";
  children = options.children || "children";
  temp = {};
  o = [];
  _ref = options.q;
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    e = _ref[_i];
    temp[e[id]] = e;
    if (temp[e[pid]] != null) {
      if (temp[e[pid]][children] == null) {
        temp[e[pid]][children] = [];
      }
      temp[e[pid]][children].push(e);
    } else {
      o.push(e);
    }
  }
  return o;
};

引用文献:

I need to create a custom tree data-structure using JavaScript

Creating trees from SQL queries in Javascript

_makeTree library

关于javascript - 从平面数组创建树对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31794829/

相关文章:

javascript - Flot 上的渐变

javascript - 字母 "pyramid"

javascript - 模板内的函数被多次调用(Angular JS)

javascript - 根据 Angular 2 中的数据库值动态加载数据卡

javascript - 我如何将 console.log 与其所有属性一起运行?

javascript - 如何使悬停图像位于其他元素之上

javascript - Angular 2 和 C# API - 未处理的 Promise 拒绝 : ReferenceError: _body is not defined

javascript - 在加载事件上显示加载器并在加载背景图像时移除加载器

javascript - 如何在没有jquery的情况下从ajax发送整数?

javascript - 为范围 ('https://.xxx.net/firebase-cloud-messaging-push-scope' 注册 ServiceWorker 失败)