如何逆走树形结构
How to reverse walk a tree structure
我已经将XML解析为JSON。我想通过遍历JSON并在每个节点上调用React.createElement
来构建React组件树。React.createElement
的第三个参数是一个子React元素的数组。这意味着我必须沿着树走到叶节点,首先创建那些React元素,然后沿着每个分支走回去。
简单,在树结构上进行递归迭代已经足够简单了。我不知道怎么说"好了,现在你在叶节点,回到上面去"有什么技巧吗?
样本数据:{
"section":{
"attrs":{
"class":"foo",
"data-foo":"foo"
},
"#name":"section",
"children":[
{
"attrs":{
"class":"region-1"
},
"#name":"p",
"children":[
{
"attrs":{
"data-children":"true"
},
"#name":"span"
}
],
"span":[
{
"attrs":{
"data-children":"true"
}
}
]
},
{
"attrs":{
"class":"second"
},
"#name":"div"
}
],
"p":[
{
"attrs":{
"class":"region-1"
},
"children":[
{
"attrs":{
"data-children":"true"
},
"#name":"span"
}
],
"span":[
{
"attrs":{
"data-children":"true"
}
}
]
}
],
"div":[
{
"attrs":{
"class":"second"
}
}
]
}
}
一般情况下,可以使用此算法。为了清晰起见,我使用了其他数据。特定于应用程序的代码将取代console.log
语句。为了实现健壮性,我添加了一个测试,测试是否存在一个children属性,并修改数据来测试它。
var data = {
name: 'Parent',
children: [{
name: 'Child 1',
children: [{
name: 'Child 1a',
children: []
}, {
name: 'Child 1b'
}
]
}, {
name: 'Child 2',
children: [{
name: 'Child 2a',
children: []
}, {
name: 'Child 2b',
children: []
}
]
}
]
};
walk(data);
function walk(node) {
if (node.children !== undefined) {
node.children.forEach(function(child) {
walk(child);
});
}
console.log(node.name);
}
您已经解决了一半的问题,因为您知道应该使用递归来遍历树。但是,不是在到达节点后立即呈现节点,而是在递归堆栈的末尾或处理完所有子节点之后才呈现节点。这有点像二叉树的有序遍历。
function iterate(node) {
if (node.children) {
node.children.forEach(function (child) {
iterate(child);
});
}
console.log(node);
}
iterate(section);
相关文章:
- 更改JSON对象的结构
- 角度控制器结构
- 从键值结构中获取数据,并将其与AngularJS中ng重复的值进行比较
- 使用递归属性迭代保留属性结构
- 如何将我的json结构转换为C3.js所需的列结构
- 嵌套对象结构
- Redux应用程序结构-在哪里放置服务/业务逻辑
- 用于视频类型的MongoDB结构's
- javascript和php中的pancard结构验证
- 如何在砖石结构中订购DOM
- 如何解析结构不良的 html 代码
- 访问嵌套函数结构中的JavaScript父函数变量
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- “createImageData()”和“new ImageData(()”有何不同
- 如何避免在树上走两次
- 从json对象聚集数据并创建层次结构
- 在我的目录结构中,将单元测试助手源文件放在哪里
- 当知道同一hiearch中至少有一个元素时,遍历到元素.结构使用jquery
- 结构化克隆算法与深度复制算法有何不同?
- 如何逆走树形结构