1

嘿伙计们,我正在尝试编写一个非常简单的 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));
},

此外,如果其他人有更简单的方法来使用 javascript 从 JSON 中删除 KV 对,我很想听听,那么必须有一种更简单的方法,然后简单地遍历整个事物并删除 KV 对。现在实际上看这个,我认为它不适用于嵌套对象/列表。例如,如果 KV 对嵌套在我认为无法删除 json[key] 的对象中,我需要跟踪有关它的对象的键,因此需要删除 json.obj1。 obj2[键]。

提前感谢您对递归的帮助以及关于从 JSON 中删除的切线。

4

2 回答 2

5

你是对的,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 truethrow true在最高级别捕获它。它们有效,但它们在概念上是错误的,因为它们的递归意义较小。

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

于 2013-05-31T19:14:00.660 回答
2

改变:

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

到:

            if (remove(delKey, delVal, o[key]) == "true") {
                return "true";
            }
于 2013-05-31T19:14:17.667 回答