javascript树在特定级别向对象添加新属性

javascript树在特定级别向对象添加新属性,javascript,vue.js,tree,treeview,Javascript,Vue.js,Tree,Treeview,我将对象数组作为树,我需要将名为“dateType”的新属性添加到第三级 let tree = [ { id: 1, name: "parent1", children: [ { id: 2, name: "child1", children: [

我将对象数组作为树,我需要将名为“dateType”的新属性添加到第三级

   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
是一个数组?如果它有两个或两个以上的元素——哪一个是树的根呢?你能留下一些反馈吗?你似乎在沉默中消失了。。。