嘿伙计们我正在尝试编写一个非常简单的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中删除的相切信息。
答案 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";
}