-1

所以我对递归函数不是超级有经验,但理想情况下,这个函数将搜索任意深度的对象以查找特定的子对象并返回它,但由于某种原因,当我return r;得到 r = undefined.

http://jsfiddle.net/RRyRQ/

function search(_for, _in) {
    var r;
    for (var p in _in) {

        // is a match
        if (p == _for) {
            console.log("MATCH");
            r = _in[_for];
            break;
        }

        // if not a match but has children
        if (p != _for && nodeCount(_in[p]) > 0 && r == false) {
            console.log("RECURSE INTO " + p);
            r = search(_for, _in[p]);
        }

    }
    return r;
}

谢谢。

4

1 回答 1

4

没有理由计算节点的数量,只要它是一个对象,您就可以假设循环是必要的 - 为自己节省循环。

这是一个简化版本:

function search(_for, _in) {
    var r;
    for (var p in _in) {
        if ( p === _for ) {
            return _in[p];
        }
        if ( typeof _in[p] === 'object' ) {
            if ( (r = search(_for, _in[p])) !== null ) {
                return r;
            }
        }
    }
    return null;
}

如果找到的对象的值为 ,则会出现问题null,同样如果您要使用falseor0-1类似的方法。也许最好只构建并返回对象的路径;这样,您只需要处理一个字符串数组,这样可以进行更安全的比较。

更新的工作小提琴:http: //jsfiddle.net/RRyRQ/3/

于 2013-09-25T00:58:19.987 回答