展平JavaScript树,尝试了一些解决方案

展平JavaScript树,尝试了一些解决方案,javascript,flatten,Javascript,Flatten,给定这棵树,有没有一种简单的方法可以在以下条件下将其转换为平面阵列 JSES5,也使用jQuery 尊重陈述顺序 添加显示缩进级别的level属性,从0开始 预期的结果应该是: [ { "root": "0", "id": "1", "name": "Frutta", "status": "1", "position": "1" "level": 0 }, { "root": "1", "id": "4", "name": "Agrumi", "st

给定这棵树,有没有一种简单的方法可以在以下条件下将其转换为平面阵列

JSES5,也使用jQuery 尊重陈述顺序 添加显示缩进级别的level属性,从0开始 预期的结果应该是:

[
 {
  "root": "0",
  "id": "1",
  "name": "Frutta",
  "status": "1",
  "position": "1"
  "level": 0
 },
 {
  "root": "1",
  "id": "4",
  "name": "Agrumi",
  "status": "1",
  "position": "3",
  "level": 1
 },
 {
  "root": "1",
  "id": "5",
  "name": "Pere",
  "status": "1",
  "position": "4",
  "level": 1
 },
 {
  "root": "0",
  "id": "2",
  "name": "Ortaggi",
  "status": "1",
  "position": "1",
  "level": 0
 },
 {
  "root": "2",
  "id": "7",
  "name": "Da foglia",
  "status": "1",
  "position": "6",
  "level": 1
 },
 {
  "root": "7",
  "id": "9",
  "name": "Insalate",
  "status": "1",
  "position": "1",
  "level": 2
 },
...
我找到了这个函数,但有一些缺点:

var flattenTree = function(treeObj, idAttr, parentAttr, childrenAttr, levelAttr) {
    if (!idAttr) idAttr = 'id';
    if (!parentAttr) parentAttr = 'root';
    if (!childrenAttr) childrenAttr = 'children';
    if (!levelAttr) levelAttr = 'level';

    function flattenChild(childObj, parentId, level) {
        var array = []; 

        var childCopy = $.extend({}, childObj);
        childCopy[levelAttr] = level;
        childCopy[parentAttr] = parentId || "0";
        delete childCopy[childrenAttr];
        array.push(childCopy);

        array = array.concat(processChildren(childObj, level));

        return array;
    };

    function processChildren(obj, level) {
        if (!level) level = 0;
        var array = [];

        obj[childrenAttr].forEach(function(childObj) {
            array = array.concat(flattenChild(childObj, obj[idAttr], level+1));
        });

        return array;
    };

    var result = processChildren(treeObj);
    return result;
};
我应该首先构建另一个数组,从子数组开始作为根数组 级别从1开始,而不是从0开始。我尝试将级别设置为-1,但没有运气 这是一把小提琴:


谢谢你

你可以为下一次调用采用递归方法并存储级别

常数 flatTree=level=0=>{children=[],…object}=>[ {…对象,级别},…children.flatMapflatTreelevel+1 ]; var-tree=[{root:0,id:1,name:Frutta,status:1,position:1,children:[{root:1,id:4,name:Agrumi,status:1,position:3,children:[]},{root:1,id:5,name:Pere,status:1,position:4,children:[]}},{root:0,id:2,name:Ortaggi,status:1,position:1,children:[{root:2,id:7,name:Da foglia,status:1,position:6,children:[{{root:7,id:9,name:Insalate,status:1,position:1,children:[]},{root:2,id:21,name:Da frutto,status:1,position:16,children:[]},{root:2,id:22,name:Da radici,status:1,position:17,children:[]},{root:2,id:23,name:Da fusto,status:1,position:8,children:[]},{root:2,id:24,name:Da bulbi,status:1,position:18,children:[]},{root:0,id:15,name:Colori,status:1,position:14,children:[{root:15,id:3,name:Banane,status:1,position:2,children:[{{root:3,id:6,name:Mele,status:1,position:5,children:[]},{root:15,id:16,name:Blu/Viola,status:1,position:10,children:[]},{root:15,id:17,name:Verde,status:1,position:11,children:[]},{root:15,id:18,name:Bianco,status:1,position:12,children:[]},{root:15,id:19,name:Giallo/Arancio,status:1,position:13,children:[]},{root:15,id:20,name:Rosso,status:1,position:14,children:[]},{root:0,id:25,name:Persone,status:1,position:24,children:[{root:25,id:26,name:Fabrizio,status:1,position:2,children:[{{root:26,id:27,name:Uomo,status:1,position:21,children:[]},{root:25,id:28,name:Ivan,status:1,position:1,children:[]},{root:0,id:29,name:Category,status:1,position:25,children:[]}], flat=tree.flatMapflatTree; 控制台。对数平面;
.作为控制台包装器{max height:100%!important;top:0;}您可以采用递归方法并存储下一次调用的级别

常数 flatTree=level=0=>{children=[],…object}=>[ {…对象,级别},…children.flatMapflatTreelevel+1 ]; var-tree=[{root:0,id:1,name:Frutta,status:1,position:1,children:[{root:1,id:4,name:Agrumi,status:1,position:3,children:[]},{root:1,id:5,name:Pere,status:1,position:4,children:[]}},{root:0,id:2,name:Ortaggi,status:1,position:1,children:[{root:2,id:7,name:Da foglia,status:1,position:6,children:[{{root:7,id:9,name:Insalate,status:1,position:1,children:[]},{root:2,id:21,name:Da frutto,status:1,position:16,children:[]},{root:2,id:22,name:Da radici,status:1,position:17,children:[]},{root:2,id:23,name:Da fusto,status:1,position:8,children:[]},{root:2,id:24,name:Da bulbi,status:1,position:18,children:[]},{root:0,id:15,name:Colori,status:1,position:14,children:[{root:15,id:3,name:Banane,status:1,position:2,children:[{{root:3,id:6,name:Mele,status:1,position:5,children:[]},{root:15,id:16,name:Blu/Viola,status:1,position:10,children:[]},{root:15,id:17,name:Verde,status:1,position:11,children:[]},{root:15,id:18,name:Bianco,status:1,position:12,children:[]},{root:15,id:19,name:Giallo/Arancio,status:1,position:13,children:[]},{root:15,id:20,name:Rosso,status:1,position:14,children:[]},{root:0,id:25,name:Persone,status:1,position:24,children:[{root:25,id:26,name:Fabrizio,status:1,position:2,children:[{{root:26,id:27,name:Uomo,status:1,position:21,children:[]},{root:25,id:28,name:Ivan,status:1,position:1,children:[]},{root:0,id:29,name:Category,status:1,position:25,children:[]}], flat=tree.flatMapflatTree; 控制台。对数平面; .作为控制台包装{最大高度:100%!重要;顶部:0;}
var flattenTree = function(treeObj, idAttr, parentAttr, childrenAttr, levelAttr) {
    if (!idAttr) idAttr = 'id';
    if (!parentAttr) parentAttr = 'root';
    if (!childrenAttr) childrenAttr = 'children';
    if (!levelAttr) levelAttr = 'level';

    function flattenChild(childObj, parentId, level) {
        var array = []; 

        var childCopy = $.extend({}, childObj);
        childCopy[levelAttr] = level;
        childCopy[parentAttr] = parentId || "0";
        delete childCopy[childrenAttr];
        array.push(childCopy);

        array = array.concat(processChildren(childObj, level));

        return array;
    };

    function processChildren(obj, level) {
        if (!level) level = 0;
        var array = [];

        obj[childrenAttr].forEach(function(childObj) {
            array = array.concat(flattenChild(childObj, obj[idAttr], level+1));
        });

        return array;
    };

    var result = processChildren(treeObj);
    return result;
};
[
 "children": <my original array here>
]