在递归javascript算法中返回语句,如何在堆栈中一直返回?

时间:2013-05-31 19:10:17

标签: javascript jquery json

嘿伙计们我正在尝试编写一个非常简单的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 [键]。

提前感谢您提供有关递归的帮助以及有关从JSON中删除的相切信息。

2 个答案:

答案 0 :(得分:5)

你是对的,返回一直向上移动,它逐级进行。

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

你是从这里回来的:

  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)。如果确实如此,我们的问题就解决了,我们自己也会回归。

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

还有其他方法,例如,您可以抛出异常并在最高级别捕获它,从而无需更改代码(将return true更改为throw true并将其捕获到最高级别它们起作用,但它们在概念上是错误的,因为它们的递归意义较小。

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

答案 1 :(得分:2)

变化:

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

为:

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