Javascript递归循环项到数组

Javascript递归循环项到数组,javascript,arrays,recursion,prompt,Javascript,Arrays,Recursion,Prompt,我正在尝试制作一个小程序,提示用户向购物清单中添加物品 我读过关于使用递归循环的书。我知道while循环可能更适合此任务,但我遇到了与while循环相同的问题,我想尝试递归。听起来好像我知道我在做什么。。。“是的,我使用递归枚举数组,同时提示用户进行验证…呼呼呼呼”。。。但是,我离题了 代码如下: function addToArray() { var array = []; array.push(prompt("Add items to array or

我正在尝试制作一个小程序,提示用户向购物清单中添加物品

我读过关于使用递归循环的书。我知道while循环可能更适合此任务,但我遇到了与while循环相同的问题,我想尝试递归。听起来好像我知道我在做什么。。。“是的,我使用递归枚举数组,同时提示用户进行验证…呼呼呼呼”。。。但是,我离题了

代码如下:

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
技术,但没有效果,数组仍然是空的。还有,为什么使用一个没有参数的函数,我不会遇到太多的递归?是因为条件语句吗

如果你知道我做错了什么,试着暗示正确的答案,而不是脱口而出。我想有一个“啊哈”的时刻。我认为这些都有助于我们更好地学习


谢谢各位。(和gals)

您的函数在每个循环/递归上重新创建var array=[]。我不确定递归是否是适合您的工作的工具—它似乎不是—但如果您从JavaScript/开发开始,只是尝试一下,那么就可以了。

您正在创建一个新数组,而不是将它传递给递归调用

改为这样做

演示:

现在,您从一个空数组开始,对于每个递归调用,它向前传递相同的数组

另外,我对其进行了更改,使其在
if()
条件下不使用
.pop()
,否则在编写时总是会得到一个空数组。(
.pop()
方法实际上删除了最后一项。)

最后,确保您没有使用
文档。在加载DOM后编写
。如果是这样,您需要将其更改为使用DOM操纵方法


您可以采用不同的方法,这样就根本不需要
.pop()

演示:



while
循环不起作用的原因很可能是因为原始的
.pop()
问题。

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

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调用时,无论如何都会打印一个空数组。

hint#1:
var-array=[]
在每个函数上创建一个新数组callhint#2:您不需要递归,只需要无限循环。是pop()引起了这个问题。我意识到它显示了数组中的最后一项,但忘记了它也会删除它。你能解释一下
array[array.length-1]='q'
实际上在做什么吗?array.length-1代表什么?Nvm找到了答案。它正在引用数组的最后一项。0表示数组项1,-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([]);
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();