节点集上的递归回调

recursive callback over set of nodes

本文关键字:递归 回调 点集 节点      更新时间:2023-09-26

我有一个树结构(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) } : {});
}