Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从平面阵列创建树对象_Javascript - Fatal编程技术网

Javascript 从平面阵列创建树对象

Javascript 从平面阵列创建树对象,javascript,Javascript,我有点被这件事缠住了。我想从平面阵列创建一个树结构。假设我有这个输入: var input = [ ["a","b","c"], ["a", "b","d"], ["e","f","g"], ]; 我想创建一个树状结构,如下所示: // output: [ { id: "a", children: [ {id: "b", children: [ {id: "c", child

我有点被这件事缠住了。我想从平面阵列创建一个树结构。假设我有这个输入:

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: []}]
          },
        ]
    }
]

我考虑这样做的一种方法是拥有所有父对象的映射,并遍历输入数组来设置父对象到子对象的映射。但是,当我试图从该映射构造树对象并避免重复时,会遇到问题。感谢您的指点,谢谢

我找到了一个与你的问题类似的问题的解决方案

如果您有如下数据:

_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
    (字符串):要在具有子元素的行中创建的“子元素”数组的名称(默认值:“子元素”)
然后结果应该类似于以下结构:

[
    {
        "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"
                    }
                ]
            }
        ]
    }
]
现在,代码:

var\u makeTree=函数(选项){
变量子项,e,id,o,pid,temp,_i,_len,_ref;
id=options.id | |“id”;
pid=options.parentid | |“parentid”;
children=options.children | |“children”;
温度={};
o=[];
_ref=options.q;
对于(_i=0,_len=_ref.length;_i<_len;_i++){
e=_ref[_i];
温度[e[id]]=e;
如果(温度[e[pid]!=null){
if(temp[e[pid]][children]==null){
temp[e[pid]][children]=[];
}
temp[e[pid]][children].push(e);
}否则{
o、 推(e);
}
}
返回o;

};从最里面的对象开始,然后将这些对象添加到上一层,然后将该对象添加到其上一层。@Jordan因此本质上是通过在每个项目上从右到左迭代来创建树?我想你可以这样想。但是,基本上我要说的是创建您的内部数组,然后使用array.push将该组添加到它上面的数组中。请记住,这个答案确实需要对您的项目进行排序(以便家长总是在他们的孩子之前。因为我找不到实现O(n)的npm模块没有这个限制的解决方案,我创建了以下一个(单元测试,100%代码覆盖率,只有0.5 kb大小,包括打字。也许它对某人有帮助:npmjs.com/package/performant-array-to-tree