javascript树在特定级别向对象添加新属性
我将对象数组作为树,我需要将名为“dateType”的新属性添加到第三级javascript树在特定级别向对象添加新属性,javascript,vue.js,tree,treeview,Javascript,Vue.js,Tree,Treeview,我将对象数组作为树,我需要将名为“dateType”的新属性添加到第三级 let tree = [ { id: 1, name: "parent1", children: [ { id: 2, name: "child1", children: [
let tree = [
{
id: 1,
name: "parent1",
children: [
{
id: 2,
name: "child1",
children: [
{ id: 4, name: "subChild1" },
{ id: 5, name: "subChild2" }
]
},
{ id: 3, name: "child2" }
]
}
];
应该是这样的:
let tree = [
{
id: 1,
name: "parent1",
children: [
{
id: 2,
name: "child1",
children: [
{ id: 4, name: "subChild1",dateType:"test" },
{ id: 5, name: "subChild2", dateType:"test" }
]
},
{ id: 3, name: "child2" }
]
}
];
我怎样才能轻松地做到这一点,因为我的方式是这样的:
custTree(res) {
let result = [];
res.forEach(level1 => {
level1.children.forEach(level2 => {
level2.children.forEach(level3 => {
console.log(level3)//nothing here
//code here
});
});
});
return result;
},
注意:树是动态的,它来自3个级别,但我始终需要更新最后一个级别您可以采用迭代和递归的方法,检查级别是否为零,以便使用新属性进行更新
let tree = [
{
id: 1,
name: "parent1",
children: [
{
id: 2,
name: "child1",
children: [
{ id: 4, name: "subChild1" },
{ id: 5, name: "subChild2" }
]
},
{ id: 3, name: "child2" }
]
}
];
这种方法采用从零开始的级别来更新对象
函数更新(数组、级别、对象){
if(level)array.forEach(o=>update(o.children | | |[],level-1,object))
else数组.forEach(o=>Object.assign(o,Object));
}
let tree=[{id:1,name:“parent1”,childs:[{id:2,name:“child1”,childs:[{id:4,name:“subChild1”},{id:5,name:“subChild2”},{id:3,name:“child2”}];
更新(树,2,{dateType:'test'});
控制台日志(树)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以采用迭代和递归的方法,检查级别是否为零,以便使用新属性进行更新
这种方法采用从零开始的级别来更新对象
函数更新(数组、级别、对象){
if(level)array.forEach(o=>update(o.children | | |[],level-1,object))
else数组.forEach(o=>Object.assign(o,Object));
}
let tree=[{id:1,name:“parent1”,childs:[{id:2,name:“child1”,childs:[{id:4,name:“subChild1”},{id:5,name:“subChild2”},{id:3,name:“child2”}];
更新(树,2,{dateType:'test'});
控制台日志(树)代码>
.as console wrapper{max height:100%!important;top:0;}
如果我理解正确,您希望在树的最深处添加属性,而不事先知道树的高度。因此,如果树的高度为5,则需要将该属性添加到级别为5的所有节点
您可以使用宽度优先遍历。通过这种方式,您可以在一个特定级别上获取所有节点,每次深入一个级别。当下一层结果为空时停止:这意味着我们到达了最深的层
这可以是一个实用函数:它将返回数组中最深级别的节点。从此以后,您可以轻松地使用该节点阵列执行任何您想要的操作:
函数GetDeepTestLevel(树){
//执行广度优先遍历
设lastLevel=[];
while(树长){
lastLevel=tree;//跟踪不为空的级别
tree=tree.flatMap(node=>node.children | |[]);//下一级
}
返回最后一级;
}
//示例树
let tree=[{id:1,name:“parent1”,childs:[{id:2,name:“child1”,childs:[{id:4,name:“subChild1”},{id:5,name:“subChild2”},{id:3,name:“child2”}];
let level=GetDeepTestLevel(树);
//对这些节点执行所需操作:
对于(级别节点)node.dataType=“测试”;
控制台日志(树)代码>如果我理解正确,您希望在树的最深处添加属性,而不事先知道树的高度。因此,如果树的高度为5,则需要将该属性添加到级别为5的所有节点
您可以使用宽度优先遍历。通过这种方式,您可以在一个特定级别上获取所有节点,每次深入一个级别。当下一层结果为空时停止:这意味着我们到达了最深的层
这可以是一个实用函数:它将返回数组中最深级别的节点。从此以后,您可以轻松地使用该节点阵列执行任何您想要的操作:
函数GetDeepTestLevel(树){
//执行广度优先遍历
设lastLevel=[];
while(树长){
lastLevel=tree;//跟踪不为空的级别
tree=tree.flatMap(node=>node.children | |[]);//下一级
}
返回最后一级;
}
//示例树
let tree=[{id:1,name:“parent1”,childs:[{id:2,name:“child1”,childs:[{id:4,name:“subChild1”},{id:5,name:“subChild2”},{id:3,name:“child2”}];
let level=GetDeepTestLevel(树);
//对这些节点执行所需操作:
对于(级别节点)node.dataType=“测试”;
控制台日志(树)代码>为什么树是数组?如果它有两个或两个以上的元素——哪一个是树的根呢?你能留下一些反馈吗?你似乎在沉默中消失了……为什么tree
是一个数组?如果它有两个或两个以上的元素——哪一个是树的根呢?你能留下一些反馈吗?你似乎在沉默中消失了。。。