Javascript 遍历树状数组
我有一个看起来像树结构的数组。这是一个对象数组,其中对象有一个子对象数组,子对象还有一个子对象数组。下面是一个例子。我曾尝试在这个问题中使用递归,但没有得到预期的结果Javascript 遍历树状数组,javascript,arrays,recursion,tree,Javascript,Arrays,Recursion,Tree,我有一个看起来像树结构的数组。这是一个对象数组,其中对象有一个子对象数组,子对象还有一个子对象数组。下面是一个例子。我曾尝试在这个问题中使用递归,但没有得到预期的结果 [ { parentId: null, children: [ { parentId: 267, children: [ { parentId: 268, chil
[
{
parentId: null,
children: [
{
parentId: 267,
children: [
{
parentId: 268,
children: [
{
parentId: 270,
children: null,
}
],
},
{
parentId: 268,
children: [
{
parentId: 269,
children: null,
}
],
}
],
}
],
},
...
...
];
我想遍历这个数组,并在每个对象中添加一个键和一个值
例如open:“fa-fa-open”
结果数组中的每个对象都必须具有上述键。
let数据=[
{
家长编号:123,
儿童:[],
},
{
家长编号:345,
儿童:[],
},
{
家长编号:1567,
儿童:[],
},
];
data.forEach(item=>item.open=“新值”)
console.log(数据)
let数据=[
{
家长编号:123,
儿童:[],
},
{
家长编号:345,
儿童:[],
},
{
家长编号:1567,
儿童:[],
},
];
data.forEach(item=>item.open=“新值”)
console.log(数据)
请查看下面链接中的代码,它递归遍历所有子项并插入open:'fa fa open'
请看下面链接中的代码,它递归遍历所有子项并插入open:“fa fa open”
您可以使用
forEach
循环创建递归函数,该循环获取数据和对象,并将该对象分配给数据中的每个对象
const data=[{“parentId”:null,“children”:[{“parentId”:267,“children”:[{“parentId”:268,“children”:[{“parentId”:270,“children”:null}]},{“parentId”:268,“children”:[{“parentId”:269,“children”:null}]}]
功能添加(数据,obj){
data.forEach(e=>{
分配对象(e、obj);
如果(e.儿童)添加(e.儿童,obj)
})
}
添加(数据,{open:'fa-fa-open'})
console.log(data)
您可以使用forEach
循环创建递归函数,该循环获取数据和对象,并将该对象分配给数据中的每个对象
const data=[{“parentId”:null,“children”:[{“parentId”:267,“children”:[{“parentId”:268,“children”:[{“parentId”:270,“children”:null}]},{“parentId”:268,“children”:[{“parentId”:269,“children”:null}]}]
功能添加(数据,obj){
data.forEach(e=>{
分配对象(e、obj);
如果(e.儿童)添加(e.儿童,obj)
})
}
添加(数据,{open:'fa-fa-open'})
console.log(data)
这类问题非常适合了解相互递归
首先,我们使用一个高阶函数f
遍历单个节点
及其子节点
const traverse = (f, { children = [], ...node }) =>
f ({ ...node, children: children.map (c => traverse (f, c)) })
例如,将属性hello
设置为'world'
添加到每个节点-
traverse
( node => ({ ...node, hello: 'world' })
, { a: 1, children: [ { b: 2 } ] }
)
// { a: 1
// , children:
// [ { b: 2
// , children: []
// , hello: 'world'
// }
// ]
// }
但这只适用于单个节点。您有一个节点数组,因此——
const traverseAll = (f, nodes = []) =>
nodes.map (node => traverse (f, node))
当您回顾遍历
时,我们看到我们重复了我们自己(用粗体)
这类问题非常适合学习相互递归 首先,我们使用一个高阶函数
f
遍历单个节点
及其子节点
const traverse = (f, { children = [], ...node }) =>
f ({ ...node, children: children.map (c => traverse (f, c)) })
例如,将属性hello
设置为'world'
添加到每个节点-
traverse
( node => ({ ...node, hello: 'world' })
, { a: 1, children: [ { b: 2 } ] }
)
// { a: 1
// , children:
// [ { b: 2
// , children: []
// , hello: 'world'
// }
// ]
// }
但这只适用于单个节点。您有一个节点数组,因此——
const traverseAll = (f, nodes = []) =>
nodes.map (node => traverse (f, node))
当您回顾遍历
时,我们看到我们重复了我们自己(用粗体)
此代码只能对平面阵列执行。问题是关于嵌套的。e、 孩子们会有像树结构一样的孩子。我误解了这个问题。这个代码只能用于平面数组。问题是关于嵌套的。e、 g子对象将具有类似于树结构的子对象。我误解了这个问题。是要获取新数组,还是只将属性插入现有数组和子对象?插入现有数组。我也无法复制此数组,因为弹出了一些循环json错误。您是要获取新数组还是只将属性插入现有数组和子数组?插入现有数组。我也无法复制这个数组,因为弹出了一些循环json错误。如果parentid为given@RenilBabu是的,您可以将parentId作为参数传递给函数,并在添加openkey的位置将其设置为条件。但我认为这将只是一个级别。我需要给定parentid的所有孩子和其他孩子不要打开fa fa如果parentid为given@RenilBabu是的,您可以将parentId作为参数传递给函数,并且在添加openkey的位置将其设置为条件。但我认为它将是唯一的一个参数水平。我需要给定父母ID的所有孩子和其他孩子不要打开fa fa