JavaScript中的递归搜索和对象

时间:2014-05-26 06:47:32

标签: javascript recursion

我正在尝试在对象中进行递归搜索,并且我试图根据某些条件找到所有匹配。我正在使用以下功能:

function checkForTitleMatch(query, node) {
    var results = [];

    if (node.attr.title.indexOf(query) != -1) {
        results.push = node;
    }

    for (var i = 0; i < node.children.length; i++) {
        checkForTitleMatch(query, node.children[i]);
    }            

    return results;
}

我不认为匹配中存在问题等等 - 我认为问题在于我在递归中返回结果的方式。

我的情况下的结果总是一个空数组,因为第一个/根元素永远不会匹配(在我的情况下)并且没有正确返回子迭代的结果,imho。

有人可以纠正我或指出必须更改的内容才能得到正确的结果吗?

2 个答案:

答案 0 :(得分:3)

你有两个问题:

(1)results.push = node;它应该是results.push(node)

(2)checkForTitleMatch的每次调用都会创建自己的results数组,并且数组永远不会聚合。

解决此问题的一种可能方法:

function checkForTitleMatch(query, node) {
    var results = [];

    (function check(node) {
        if (node.attr.title.indexOf(query) != -1) {
            results.push(node);
        }

        for (var i = 0; i < node.children.length; i++) {
            check(node.children[i]);
        }
    })(node);           

    return results;
}

即使清晰/更快,也会使用attribute selector,例如

node.querySelectorAll('*[title*=' + query + ']');

虽然这不会查询顶级节点node,并假设query没有&#34;特殊字符&#34;。

答案 1 :(得分:0)

值得注意的是,您可以通过使用Array.concat合并结果来解决此问题:

function checkForTitleMatch(query, node){
    var results = [];

    if (node.attr.title.indexOf(query) != -1){
        results.push(node);
    }

    for (var i=0; i<node.children.length; i++){
        results = Array.prototype.concat.apply(results, 
            checkForTitleMatch(query, node.children[i])
        );
    }            

    return results;
}

另请参阅:Function.prototype.apply()