JavaScript递归循环项目转为数组

3
我正在尝试编写一个小程序,提示用户添加物品到购物清单中。
我了解使用递归循环的方法。虽然使用while循环可能更适合这个任务,但是我遇到了相同的问题,所以我想尝试一下递归。这听起来就像我知道自己在做什么一样......“是的,我使用递归来枚举数组并提示用户进行验证... hur hur hur”,但是我跑题了。
以下是代码:
function addToArray() {
          var array = [];
          array.push(prompt("Add items to array or 'q' to stop"));
          if (array.pop() == 'q') {
              document.write(array)
          }
          else {
              addToArray();
          }
      }
      addToArray();

如果你注意到了,它的循环是正确的,但它没有将项目添加到数组中。我已经尝试过使用array[i] = i 技术,但无济于事,数组仍然为空。另外,为什么使用没有参数的函数不会遇到太多递归?这是因为条件语句吗?
如果你知道我做错了什么,请提示正确的答案,而不是直接说出来。我想要那个“啊哈”时刻。我认为这一切都有助于我们更好地学习。
谢谢大家(和女士们)。

3
提示 #1:var array = []; 在每次函数调用时都会创建一个新的数组。 - zerkms
1
提示#2:你不需要递归,而是一个无限循环。 - zerkms
3个回答

6
你创建了一个新的数组,而不是将其传递给递归调用。
请改为以下方式。
演示:http://jsfiddle.net/kDtZn/
function addToArray(array) {
    array.push(prompt("Add items to array or 'q' to stop"));
    if (array[array.length-1] == 'q') {
        array.pop();
        document.write(array)
    }
    else {
        addToArray(array);
    }
 }
 addToArray([]);

现在你从一个空数组开始,对于每个递归调用,它都将同样的数组向前传递。
此外,我更改了它,以便在if()条件中不使用.pop(),否则当写入时,你总是最终得到一个空数组。(.pop()方法实际上是删除最后一项。) 最后,请确保在DOM加载后不要使用document.write。如果这样,你需要将其更改为使用DOM操作方法。

你可以采用不同的方法,这样就不需要使用 .pop() 了。

演示: http://jsfiddle.net/kDtZn/1/

function addToArray(array) {
    var item = prompt("Add items to array or 'q' to stop");
    if (item == 'q') {
        document.body.textContent = array;
    } else {
        array.push(item);
        addToArray(array);
    }
}
addToArray([]);

你的while循环不起作用的原因很可能是由于最初的.pop()问题。

嘿,谢谢啊。问题出在pop()上。我意识到它显示了数组中的最后一个项目,但忘记了它也会删除它。你能解释一下 array[array.length-1] == 'q' 的本质是什么吗?array.length-1代表什么? - Jerry Walker
搞定了。它是在引用数组的最后一项。0代表数组的第一项,-1代表最后一项。谢谢啊。 - Jerry Walker

1

虽然“无限循环”可能是你真正想要的(因为它可能会使代码更简单),但你可以通过递归来实现这个目标,将数组设置为默认值并将其作为参数传递给函数。像这样...

function addToArray( array ) {
  var array = array || [];
  array.push(prompt( "Add items to array or 'q' to stop" ));
  if ( array[array.length - 1] === 'q' ) {
    document.write(array.slice( 0, -1 ))
  } else {
    addToArray( array );
  }
}

addToArray();

您呈现的代码存在两个问题。首先,正如先前指出的那样,每次调用函数时都会重新定义您的数组变量。其次,array.pop() 会改变您的数组,因此当您到达 document.write 调用时,您将打印一个空数组。

1
你的函数在每次循环/递归时重新创建了 var array = []。我不确定递归是否是你这种情况下正确的工具 - 似乎并不是 - 但如果你是刚开始学习 JavaScript/开发并且只是尝试一下,那么没问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接