0

我在使用下面的代码首先递归循环“对象”对象时使用了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 时,它会遍历其余对象及其属性值对。有人可以解释为什么在使用 return 时它只以第一个对象值结尾吗?

4

3 回答 3

3

为了更容易理解循环内递归,在循环goThrough()内放一个 return。

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分析输出。

于 2019-12-29T00:35:23.310 回答
1

需要[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);

于 2019-12-29T00:28:59.193 回答
1

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

于 2019-12-29T00:34:22.057 回答