为什么递归在使用返回时只会导致第一个嵌套对象值的值,而不是其余值?



我在使用以下代码首先递归遍历"对象"对象时使用 return 关键字,但它只通过多次循环导致 king 属性的对象,当它到达 sika 属性和值时,它结束循环。

let object = {king: {lisa: {biza: {sika: 21}}}, queen:{billy: {silly: 23}}, guard: {son: 4}};
function goThrough(obj) {
let list = Object.keys(obj);
for(let keys of list) {
console.log("property: " + keys + ", value: " + JSON.stringify(obj[keys]));
goThrough(obj[keys]); //Note: using return keyword here results in only king's values looped over
}  
}
goThrough(object);

但是当我省略 return 时,它会循环遍历其余对象及其属性值对。有人可以解释为什么在使用返回时它只以第一个对象值结尾吗?

为了更容易理解 in 循环递归,请在循环内goThrough()之后放置一个返回。

let object = {king: {lisa: {biza: {sika: 21}}}, queen:{billy: {silly: 23}}, guard: {son: 4}};
function goThrough(obj) {
let list = Object.keys(obj);
for(let keys of list) {
console.log("property: " + keys + ", value: " + obj[keys]);
goThrough(obj[keys]);
return;
} 
}
console.log(goThrough(object))

当使用如上所示的 return 时,一旦代码从递归返回,它将立即停止函数执行,并且不会通过其他属性 queen 和 guard。您可以通过使用 return 明确禁止这样做。

如果省略返回,则在第一个分支完成king: {lisa: {biza: {sika: 21}}}之后,代码将继续使用其他属性并尽可能深入。同样的事情发生在第一个财产国王身上,它下降到它的所有孩子(tnx递归(。

为了更多地了解它。将断点放在代码中并观察堆栈调用,填充函数并从中返回。您也可以在goThrough()return之间放置一个控制台并分析输出。

当您将 return 语句放入循环中时,该循环仅对key的一个值执行(在本例中为"king"(。然后,它从函数中返回,因此不会触及其他键。希望这对:)有所帮助

需要[object object]转换为字符串以提高可见性,这是代码

let object = {king: {lisa: {biza: {sika: 21}}}, queen:{billy: {silly: 23}}, guard: {son: 4}};
function goThrough(obj) {
let list = Object.keys(obj);
for(let keys of list) {
console.log("property: " + keys + ", value: " + JSON.stringify(obj[keys]));
goThrough(obj[keys]);
}  
}
goThrough(object);

最新更新