节点集上的递归回调
recursive callback over set of nodes
我有一个树结构(jstreet .js),它是DOM元素的列表。对于每个元素,我检查它是否是父元素,选择它的子元素,并检查父元素的状态,…
我需要将树元素解析为对象数组。如果一个元素是父元素,它被赋予一个额外的属性,作为它的子对象的数组。这些子对象将被递归地检查。
这是我试图解析DOM元素列表的基本结构。这是我正在寻找的输出
[ {s:0,c:[ {s:1}, {s:2,c:[s:3]}, {s:4} ]} ]
下面是基本的递归函数:检查节点的type()
。如果它是一个家长,我试图使用回调递归的一组孩子。如果它是子元素,那么我返回id属性
function Parse3(rootelem,OBJ,freduce) {
function type(e){
//var e = new Element(root.id)
// return !e.isParent ? {'sibling':e.jstxt} : freduce( parent, cb)
if (!e.isParent){
console.log('- - - CHILD - - -', e.jstxt )
return {'sibling':e.jstxt}
}
if (e.isParent) {
console.log('- - - PARENT - - -', e.jstxt )
return freduce(OBJ, e, function(i){
for ( var i=0; i<e.numchildren; i++ ){
console.log('recurse',i ,' ', type( e.childElements[i]) );
type( e.childElement[i] )
}})
}
}//close type
return type(rootelem)
}//Parse3
接下来,(我得到了这个工作与基本类型),但由于我正在处理的方法,我返回一个减少函数持有cb。
function freduce(OBJ, e,cb){
OBJ.push( {'sibling':e.jstxt, 'xml':[] } )
var obl= OBJ.length-1 == undefined ? 0 : OBJ.length-1
OBJ[ obl ].xml.push( cb )
return OBJ
}
如何遍历所选的子节点。我对javascript有点陌生,我不太确定我用来迭代孩子的回调逻辑。此外,我不确定如何将child属性减少到一个元素对象。
(在处理嵌套结构时,我能够让它与原语(数字)一起工作。处理对象和遍历子元素集会导致问题…)
任何建议都是赞赏的!
您实际上不需要调用freduce
,这只会使事情变得复杂。您可以在type函数中创建xml
属性,而不需要整个调用和回调模式。
另外,您应该尽量不要传递OBJ
:而是从递归返回值到最终返回值构建它:这是调用者获得结果的方式:
function parse3(rootelem) {
function type(e){
var obj = {'sibling': e.jstxt};
if (e.isParent){
obj.xml = [];
for (var i=0; i<e.numchildren; i++ ){
obj.xml.push(type(e.childElement[i]));
}
}
return obj;
}
return type(rootelem);
}
注意:最好不要用大写字母来命名变量,这通常用于表示常量基本值。另外,第一个字母不应该大写,因为这主要用于构造函数/类名。
进一步改进:
在上面的代码中,函数parse3
和函数type
在本质上没有什么不同:它们都接受相同的参数,返回相同类型的信息。
此外,您可以使用map
函数迭代childElement
列表,或者(如果它不是一个真正的数组)使用Array.from
回调。然后,利用Object.assign
:
function parse3(e) {
return Object.assign ({sibling: e.jstxt},
e.isParent ? { xml: Array.from(e.childElement, parse3) } : {});
}
相关文章:
- 递归回调
- 带有回调的Javascript对象方法中的递归
- jQuery.fadeIn()和.fadeOut()回调在将代码重写为递归回调后无法正常工作
- 使用回调的递归Javascript函数不起作用
- 递归和传递 Ajax 回调
- 使用递归函数按顺序执行多个 ajax 请求,并在所有请求完成后执行回调函数
- 回调函数中的递归
- 如何"递归AJAX回调”;在JavaScript工作中
- 递归回调机制
- 什么'这是停止递归回调的最佳方法
- backbone.js集合-如何为fetch定义成功回调(不过是递归的)
- 如何在node.js中通过API回调异步递归
- 如何在异步递归方法完全就绪时创建回调
- 在递归函数中不能调用回调函数
- 节点集上的递归回调
- 使用回调来减慢循环的函数在递归使用时会变得混乱
- 对递归函数的回调
- 如何处理节点中的递归回调
- Node.js异步递归回调
- robot -递归回调- JavaScript