【问题标题】:proper use of the array.push method正确使用 array.push 方法
【发布时间】:2013-06-21 04:48:30
【问题描述】:

如果我有一个将偶数添加到数组的简单测试函数:

function isEven(n){
    var enumbers = [];
    if (n % 2 == 0){
        enumbers.push (n);
    }
}

如何增加我的参数,直到我的数组中有一定数量的成员?例如,我试过这个:

function isEven(n){
    var enumbers = [];
    while ( enumbers.length < 10){
    if (n % 2 == 0){
        enumbers.push (n);
    }
    console.log (enumbers);
             n = n + 1;
    isEven(n);
    }
}
isEven(1);

但它似乎只是为每个数字创建一个新数组,直到它最终引发范围错误(超出最大调用堆栈大小)。

【问题讨论】:

  • 测试enumbers.length?
  • 您在循环中递归调用isEven。因此,对于每个函数调用,您实际上都会额外调用您的函数 10 次。
  • 这是一个错字...我已经更正了,但我得到了相同的结果。
  • 这个函数应该做什么?
  • 继续评估数字 1 到将预定(在本例中为 10)个偶数推入“enumbers”数组所需的次数。

标签: javascript


【解决方案1】:

它会多次创建该数组,因为您不断地调用该函数:

isEven(n);

您也不是比较数组的长度,而是比较数组。将.length 添加到enumbers。尝试更改为:

var enumbers = [];
while ( enumbers.length < 10){
    if (n % 2 == 0){
        enumbers.push (n);
    }
    console.log (enumbers);
}

【讨论】:

  • 策略是继续调用 isEven 直到数组有十个成员。这就是为什么我把它放在一个while循环中。我想我只需要知道如何正确增加函数参数 isEven(?)
  • 你不需要一直调用它,因为每次你这样做,它都会重新初始化数组。您的 while 循环负责处理至少 10 个数字部分。
  • @kjarsenal:考虑调用一个函数,将 one 数字重复(递归)放入数组中,或者将该函数的主体放入循环中。两者都不是。
  • 谢谢Bergi 和Vitim。我想我误解了 while 循环的运行方式。感谢您的帮助。
【解决方案2】:

我不确定我是否理解您的问题。 但是你不应该使用全局变量,也没有必要在 while 循环中递归调用你的函数。

错误maximum call stack size exceeded 是您的浏览器试图打破无限循环。

这就是你需要的。

此处为jsFiddle1jsFiddle2 的示例

function isEven(n) {
    var enumbers = [];

    while (enumbers.length < 10) {
        if (n % 2 == 0) {
            enumbers.push(n);
        }
        n++;
    }
    return enumbers;
}

设置测试

var n = 1;
var evenArray = isEven(n); //call isEven function and it returns an array

document.body.innerHTML = evenArray; //2,4,6,8,10,12,14,16,18,20

【讨论】:

    【解决方案3】:

    问题在于 (enumber

    while (enumbers.length < 10) {
    

    另一件事。 enumbers 是一个局部变量,所以每次调用 isEven 都有它自己的数组。因此,函数被递归调用,一遍又一遍。

    【讨论】:

    • 现在已修复。不过,试试[0,2,4] &lt; 10
    【解决方案4】:

    我建议你在 is even 方法之外创建数组

    【讨论】:

      【解决方案5】:

      我会写这样的:

      function isEven(n,enumbers){  
          while(enumbers < 10){  
              if (n % 2 == 0){  
                   enumbers.push (n);  
              }
              console.log (enumbers);  
              n = n + 1;  
              isEven(n, enumbers);  
          }  
      }  
      var enumbers = [];  
      isEven(1,enumbers);
      

      【讨论】:

      • 这实际上正是我想要完成的。在我记得将 .length 添加到 enumber 之前,您刚刚复制了我的代码库。这很棒
      • 请使用递归 while循环
      猜你喜欢
      • 2016-12-27
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2015-12-17
      • 2012-02-23
      • 2016-04-14
      相关资源
      最近更新 更多