javascript - 节点集上的递归回调

标签 javascript recursion callback

我有一个树结构(jstree.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 的reduce 函数。

   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 有点陌生,不太确定我用来迭代子项的回调逻辑。此外,我不确定如何将子属性减少为元素对象。

(在处理嵌套结构时,我能够让它与基元(数字)一起使用。处理对象并迭代子元素集会导致问题......)

如有任何建议,我们将不胜感激!

最佳答案

你真的不需要打电话freduce这只会让事情变得复杂。您可以创建 xml类型函数内部的属性,没有整个调用和回调模式。

此外,您应该尽量不要通过 OBJ around:而是从递归返回值构建它,直到最终返回值:这是调用者获取结果的方式:

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 没有什么不同:它们都采用相同的参数并返回相同类型的信息。

此外,您可以迭代 childElement列表带有 map函数,或者(如果它不是真正的数组),带有 Array.from打回来。然后,利用 Object.assign 在一个表达式中完成所有操作也变得很好。 :

function parse3(e) {
    return Object.assign ({sibling: e.jstxt},
        e.isParent ? { xml: Array.from(e.childElement, parse3) } : {});
}

关于javascript - 节点集上的递归回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40530679/

相关文章:

javascript - 当鼠标悬停在链接上时隐藏 href url 中的状态栏值

recursion - Scheme 中的尾递归函数

java - 反向字符串递归方法

sql-server-2008 - T/SQL 中的递归子/父查询

javascript - 从回调函数内部返回 javascript 变量

javascript - 任何人都可以帮助解决这个 for 循环错误吗?

javascript - 使用纯 JavaScript 处理 "onclick"事件

ios - 如何在 iOS Swift 中将数据数组回调到另一个 viewController

ruby-on-rails - 如何根据我在 Rails 中的响应状态代码跳过 after_filter 回调?

javascript - 监听响应式网页设计的浏览器宽度?