Javascript 关于For循环和递归使用的一般问题

Javascript 关于For循环和递归使用的一般问题,javascript,recursion,Javascript,Recursion,我目前正在尝试学习递归,并致力于使用递归创建自己的JSON.stringify函数。到目前为止,我还没有对循环使用任何,来解决我所遇到的任何问题。递归中是否允许使用for循环?我的代码示例 function stringify(object) { var string = '{'; for (var key in obj) { if (obj[key] === undefined) { return string += '}'; } else {

我目前正在尝试学习递归,并致力于使用递归创建自己的
JSON.stringify
函数。到目前为止,我还没有对循环使用任何
来解决我所遇到的任何问题。递归中是否允许使用
for循环
?我的代码示例

function stringify(object) {
  var string = '{';
  for (var key in obj) {
      if (obj[key] === undefined) {
        return string += '}';
      } else {
        return string += key.toString() + obj[key].toString() + stringify(object);
      }
  }
}

现在我知道,当执行
stringify(object)
时,它将在
object
的第一个属性处重新启动
for循环
,这将导致一个无休止的循环。我的问题是,在尝试使用递归生成函数时,是否可以使用
for循环
?或者我应该改变解决这个问题的方法,避免循环
for
。我只是在寻找解决这个问题的方法的指导,而不是任何直接的代码答案。谢谢

您的if条件永远不会变为真,因此它总是执行else语句并再次调用它的self。
当使用递归时,你应该考虑一个结束条件,当循环到达该条件时,它不再调用它自己。 在您的示例中,应该在函数到达给定对象内的对象时调用该函数,当没有对象时递归结束。 当前,您再次在其内部调用整个对象,它将导致一个无限循环

var myObj={a:1,b:2,c:3,d:{r:4,t:5};
函数字符串化(对象){
让字符串=”;
for(让输入对象){
串+=
key.toString()+
" : [" +
(对象类型[键]=“对象”
?字符串化(对象[键])
:对象[key].toString())+
"] " ;
}
返回字符串;
}

console.log(stringify(myObj))如果您确实希望在没有循环的情况下执行此操作,可以执行以下操作:

function stringify(obj, raw) {
  let [[k, v], ...rest] = Object.entries(obj), // Take the first entry and the rest
    r = k + ": ";

  // Process the first entry in the object  
  if (typeof v == "object") {
    r += stringify(v); // recursively call for inner objects
  }
  else {
    r += v;
  }

  // Process the remaining entries (if there are more)
  if (rest.length) {
    r += ", " + stringify(Object.fromEntries(rest), true);  // recursively call for remainder of present object
  }

  // Wrap the string in {} if needed
  if (raw) {
    return r;
  }
  else {
    return "{" + r + "}";
  }

}

console.log(stringify({x: 10, y: 5, params: {a: 3, b: 4}}));

一个缺点是,对于大型对象,可能会遇到最大递归深度问题。这可以通过在递归函数中使用循环来避免。您还必须考虑如何处理数组(在上面的代码中被忽略)。

我想我只是对在递归函数中使用for循环感到困惑。我不是每次调用递归时都会循环遍历对象的第一个属性吗?我的意思是,当我对数组进行递归时,我能够在调用递归时分割第一个元素,从而允许我遍历数组。但是,对于一个对象,如果它再次调用同一个对象而不删除任何属性,我不明白它如何能够遍历该对象的每个属性。@newatlearning这我不确定您想理解什么,在对象内部不会删除或更改任何内容。我们循环遍历一个对象,输出属性和值,但是,如果值本身是一个对象,我们将它传递给函数,这样函数就循环遍历它,输出它的属性和值,并返回结果。结果位于我们调用的函数的位置,内部连接然后继续第一个循环。关键是在使用递归时必须有一个条件,这样它就不会重复自身infinitely@NewAtLearningThis在您的代码中,您将主对象传递给函数,而不是内部对象,这就是为什么您的函数成为无限递归,看看您的代码,您将得到它,调用对象到函数,在它里面,你用同一个对象再次调用它,这就是为什么它永远循环“你的if条件永远不会变为真”——它可以变为真,例如if
obj={k:undefined}
@Stuart是的,在这种情况下它可以发生,但是,他调用函数
stringify(object)
并在它里面,而不是
stringify(obj[key])
他再次调用
stringify(object)
。所以相同的值传递给函数,相同的执行发生,否则语句再次执行,并用相似的值再次调用自己是的,在递归函数中通常会有某种循环。组织它的另一种方法可能是让函数获取在对象中找到的第一个元素,然后递归地将其余元素传递给它自己。但循环是一种更明显的编写方法。