JSON对象中的JavaScript递归搜索

Dro*_*out 24 javascript recursion json

我试图返回JSON对象结构中的特定节点,如下所示

{
    "id":"0",
    "children":[
        {
            "id":"1",
            "children":[...]
        },
        {
            "id":"2",
            "children":[...]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

所以这是一个像树一样的孩子 - 父母关系.每个节点都有一个唯一的ID.我试图找到一个特定节点这样

function findNode(id, currentNode) {

    if (id == currentNode.id) {
        return currentNode;
    } else {
        currentNode.children.forEach(function (currentChild) {            
            findNode(id, currentChild);
        });
    }
}  
Run Code Online (Sandbox Code Playgroud)

我执行搜索,例如findNode("10", rootNode).但即使搜索找到匹配项,该函数也会返回undefined.我有一种不好的感觉,递归函数在找到匹配后不会停止并继续运行finally返回,undefined因为在后面的递归执行中它没有到达返回点,但我不知道如何解决这个问题.

请帮忙!

But*_*ak3 42

递归搜索时,必须通过返回结果传回结果.但是你没有归还结果findNode(id, currentChild).

function findNode(id, currentNode) {
    var i,
        currentChild,
        result;

    if (id == currentNode.id) {
        return currentNode;
    } else {

        // Use a for loop instead of forEach to avoid nested functions
        // Otherwise "return" will not work properly
        for (i = 0; i < currentNode.children.length; i += 1) {
            currentChild = currentNode.children[i];

            // Search in the current child
            result = findNode(id, currentChild);

            // Return the result if the node has been found
            if (result !== false) {
                return result;
            }
        }

        // The node has not been found and we have no more options
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不得不在for循环中添加一个额外的检查(即for(i = 0; currentNode.children!== undefined && i <currentNode.children.length; i + = 1))以避免错误"TypeError:Can not在不存在"children"的叶节点处读取未定义的属性"length". (6认同)
  • 中断无法找到未定义的长度。它是一个文档对象。 (2认同)

Tri*_*ode 5

function findNode(id, currentNode) {

    if (id == currentNode.id) {
        return currentNode;
    } else {
        var result;
        currentNode.children.forEach(function(node){
            if(node.id == id){
                result = node;
                return;
            }
        });
        return (result ? result : "No Node Found");
    }
}
console.log(findNode("10", node));
Run Code Online (Sandbox Code Playgroud)

如果节点存在于节点列表中,则此方法将返回该节点。但这将循环遍历节点的所有子节点,因为我们无法成功中断流程forEach。更好的实现如下所示。

function findNode(id, currentNode) {

    if (id == currentNode.id) {
        return currentNode;
    } else {
        for(var index in currentNode.children){
            var node = currentNode.children[index];
            if(node.id == id)
                return node;
            findNode(id, node);
        }
        return "No Node Present";
    }
}
console.log(findNode("1", node));
Run Code Online (Sandbox Code Playgroud)