Javascript 以动态深度访问嵌套数组

Javascript 以动态深度访问嵌套数组,javascript,json,Javascript,Json,我有下面一段json,它遵循一个特定的模式,但是每个对象可以有任意数量的子对象,每个子对象可以有任意数量的子对象 问题是,我只需要访问这个嵌套对象/数组结构中特定深度的对象 这种深度是动态的 如果深度等于3,那么我想在该级别的子数组中添加一个新的虚拟对象。因此,新结构将如下所示 [ { "name": "1st level", "parentId": "", "id": "dummyvalue1", "children": [ {

我有下面一段json,它遵循一个特定的模式,但是每个对象可以有任意数量的子对象,每个子对象可以有任意数量的子对象

问题是,我只需要访问这个嵌套对象/数组结构中特定深度的对象

这种深度是动态的

如果深度等于3,那么我想在该级别的子数组中添加一个新的虚拟对象。因此,新结构将如下所示

[
  {
    "name": "1st level",
    "parentId": "",
    "id": "dummyvalue1",
    "children": [
      {
        "name": "2nd level child",
        "parentId": "dummyvalue1",
        "id": "dummyvalue2"
      },
      {
        "name": "another 2nd level child",
        "id": "dummyvalue3",
        "children": [
          {
            "name": "3rd level child",
            "id": "dummyvalue4",
            "children": [
              {
                "name": "4th level child",
                "parentId": "dummyvalue4",
                "id": "dummyvalue5"
              }
            ],
            "parentId": "dummyvalue3"
          },
          {
            "name": "NEW OBJECT",
            "parentId": "dummyvalue3",
            "id": "random"
          }
        ],
        "parentId": "dummyvalue1"
      }
    ]
  }
]

有没有干净的方法可以做到这一点?而不是试图迭代到正确级别的巨大循环。我也不认为我可以使用点符号,因为级别数和深度变量是动态的

我创建了这个函数:

function addChild(currentChild, childToAdd, depth) {
  if (depth === 1) {
    currentChild.children.push(childToAdd);
    return;
  }

  const nextChild = currentChild.children.filter(child => child.children && child.children.length)[0];

  if (!nextChild) {
     if (currentChild.children && currentChild.children.length) {
       currentChild.children[0].children = [childToAdd];
     } else {
       currentChild.children = [childToAdd];
     }
     return;
  }

  addChild(nextChild, childToAdd, depth - 1);
}
它需要3个参数:

当前的孩子 要添加的孩子 要穿过的剩余深度 如果深度为1,则只需将子对象添加到子对象。如果没有,它会查看子函数的内部,取第一个包含子函数的函数,并对同一个函数进行递归调用

常数数据=[ { 名称:一级, 父ID:, id:dummyvalue1, 儿童:[ { 姓名:二级儿童, parentId:dummyvalue1, id:dummyvalue2 }, { 姓名:另一个二级孩子, id:dummyvalue3, 儿童:[ { 姓名:三级儿童, id:dummyvalue4, 儿童:[ { 姓名:四级儿童, parentId:dummyvalue4, id:dummyvalue5 } ], parentId:dummyvalue3 } ], parentId:dummyvalue1 } ] } ] 函数addChildcurrentChild,childToAdd,depth{ 如果深度===1{ currentChild.children.pushchildToAdd; 回来 } const nextChild=currentChild.children.filterchild=>child.children&&child.children.length[0]; 如果!下一个孩子{ 如果currentChild.children&¤tChild.childrence.length{ currentChild.children[0]。children=[childToAdd]; }否则{ currentChild.children=[childToAdd]; } 回来 } addChildnextChild,childToAdd,depth-1; } addChilddata[0],{foo:'bar'},3; addChilddata[0],{bar:'baz'},2; addChilddata[0],{baz:'foo'},1; addChilddata[0],{extracchild:'foo'},4;
控制台日志数据;需要注意的是,这将始终添加到匹配深度的第一个元素的子元素中。是的,我在代码段上面已经提到了它。如果我指定深度为2,而现有数据结构只有1级深度,该函数会做什么?i、 e级别1的子数组不存在。。是否可以在该点创建它?@bobbyrne01我已经更新了我的代码,因此如果初始深度大于对象的最大深度,它会在提供的最大深度处向子对象添加一个子对象。@bobbyrne01如果可以,请随意投票并接受我的回答如果在您的对象名称中有一个children属性,并且该路径也包含三级深度,该怎么办?是否要在级别3的两个路径中推送新对象?否,我想使用dummyvalue4作为父对象的标识符来指定要插入的第三级子对象
function addChild(currentChild, childToAdd, depth) {
  if (depth === 1) {
    currentChild.children.push(childToAdd);
    return;
  }

  const nextChild = currentChild.children.filter(child => child.children && child.children.length)[0];

  if (!nextChild) {
     if (currentChild.children && currentChild.children.length) {
       currentChild.children[0].children = [childToAdd];
     } else {
       currentChild.children = [childToAdd];
     }
     return;
  }

  addChild(nextChild, childToAdd, depth - 1);
}