展平JavaScript树,尝试了一些解决方案
给定这棵树,有没有一种简单的方法可以在以下条件下将其转换为平面阵列 JSES5,也使用jQuery 尊重陈述顺序 添加显示缩进级别的level属性,从0开始 预期的结果应该是:展平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
[
{
"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>
]