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