返回语句在递归javascript算法,如何返回所有的方式堆栈

return statement in recursive javascript algoritum, how to return all the way up the stack?

本文关键字:返回 堆栈 方式 何返回 语句 递归 javascript 算法      更新时间:2023-09-26

嘿,伙计们,我想写一个非常简单的JSON删除函数,我递归地遍历JSON。当我找到一个键值对匹配时,我想在JSON中删除这对,并返回true,因为这对被删除了。我遇到的问题是,返回值不会一直到递归堆栈。我意识到我不能这么做…

return true;

,但我不想返回整个函数。我需要这样做吗?

return this.true;

我还想在找到KV对匹配后打破递归,而不是继续搜索JSON的其余部分。目前,它正在继续处理JSON的其余部分。是否有可能在找到匹配后打破递归?

这里是一些代码,希望能使它更清楚。

deleteItems: function (toDelete) {
    self = this;
    var keys = toDelete.find(".key");
    var vals = toDelete.find(".val");
    for (var i = 0; i < keys.length; i++) {
        $.each(this.json, function (key, val) {
            console.log(keys[i].value + " : " + vals[i].value);
        });
    }
    function remove(delKey, delVal, o) {
        console.log(delKey + " : " + delVal);
        for (var key in o) {
            if (typeof o[key] === "object") {
                console.log(key + " : [");
                remove(delKey, delVal, o[key]);
            } else {
                if (delKey == key && delVal == o[key]) {
                    console.log("delete match: " + delKey + " : " + delVal + " , " + key + " : " + o[key]);
                    //delete this item. 
                    return "true";
                }
            }
        }
    }
    console.log(remove(keys[0].value, vals[0].value, this.json));
},

另外,如果有人有更简单的方法从JSON中使用javascript删除KV对,我很乐意听到它,必须有一个更简单的方法,然后简单地遍历整个东西并删除KV对。现在实际上看着这个,我不认为它将工作为嵌套的对象/列表。例如,如果KV对嵌套在对象中,我认为我不能删除json[key],我需要跟踪关于它的对象的键,所以它需要删除json.obj1.obj2[key]。

提前感谢递归的帮助和关于从JSON中删除的切线。

你是对的,return 不是一直往上走,它是一层一层往上走。

让我们看看你能做些什么来处理它!

你正在从这里返回:

  if (delKey == key && delVal == o[key]) {
       console.log("delete match: " + delKey + " : " + delVal + " , " + key + " : " + o[key]);
       //delete this item. 
       return true;
   }

问题是,对于调用算法的其他方法来说,这并不重要,我们想要做什么是让它们在找到匹配时停止。

你有这一行:

remove(delKey, delVal, o[key]);

我们想知道这里发生了什么,像这样的东西可以工作:

if(remove(delKey, delVal, o[key])){ // if I got a match, return true;
    return true;
}

通过这种方式,成功将在所有调用堆栈中冒泡。我们正在检查小问题的结果是否解决了大问题(在本例中,意味着它返回true)。如果是,我们的问题就解决了,我们自己返回true。

还有其他方法可以解决这个问题,但这种方法很好,因为它解决了手头的递归问题。我们解决了小问题,继而解决了大问题。

还有其他方法,例如,您可以抛出一个异常并在最高层捕获它,从而消除了更改代码的需要(将return true更改为throw true并在最高层捕获它)。它们是有效的,但在概念上是错误的,因为它们的递归意义较小。

另一个提示,返回true(这是一个真实的语言值),而不是"true",这只是一个字符串。

变化:

            remove(delKey, delVal, o[key]);

:

            if (remove(delKey, delVal, o[key]) == "true") {
                return "true";
            }