创建未定义的新数组的函数

时间:2018-08-24 22:01:41

标签: javascript arrays loops if-statement

我正在尝试编写一个程序,该程序创建一个数组并将其填充一系列数字。函数范围的x,y,z变量与每个步骤的开始编号,结束编号和编号值相关。我的目标是生成一个数组,该数组包含每个步骤创建的x和y之间(包括x和y)之间的所有数字。这是代码:

let newarray = []

function range (x, y, z){
  if (x === undefined || y === undefined || z === undefined || (x > y) || (z < 0)) {
    return newarray;                          // returns empty array if x, y, or z is undefined, x is greater than y or z is a negative integer
  }
  else if (y > x) {
    for (x; x < y; x = x += z) {
      newarray.push(x);                       //pushes x into an array then adds z into x and loops until x exceeds y
    }
  } 
  else {
    return newarray;                          //prints out new array
  }
}

console.log(range(0, 10, 2));
console.log(range(10, 30, 5));
console.log(range(-5, 2, 3));

现在,它为所有三个数字生成未定义的。我的研究提出了一些关于异步性的东西?我不确定这是什么意思。

3 个答案:

答案 0 :(得分:2)

一些事情在这里发挥作用:

  1. newArray应该在函数范围内定义,而不是全局变量。否则,对函数的后续调用将继续追加到同一数组上,这可能不是您的意图(如果是,则为array.concat())。

  2. 您的最后一个else无法访问,因此该函数将为验证失败的输入返回空数组,或者在将数组填充到其中后控件到达函数末尾时返回undefined else if块。

  3. x = x += z的意图可能是x += z

  4. 您应该禁止使用z === 0,否则您将陷入无限循环。

  5. 普通的JS样式是camelCase变量名。

此外,我发现编写条件要比条件更容易。在这种情况下,枚举允许的参数似乎是最干净的。这种方法使您只能有一个return语句和较少的条件分支,从而减轻了潜在的混乱。

以下是解决这些问题的版本:

function range(x, y, z) {
  const newArray = [];
  
  if ([x, y, z].indexOf(undefined) < 0 && x < y && z > 0) {
    for (; x < y; x += z) {
      newArray.push(x);
    }
  } 
  
  return newArray;
}

console.log(range(0, 10, 2));
console.log(range(10, 30, 5));
console.log(range(-5, 2, 3));

答案 1 :(得分:1)

请注意,您检查else if (y > x)的部分没有退货。当此条件为真时,您的函数将返回undefined。要解决此问题,只需在函数的最后一行添加return newarray;。然后用return new array;删除所有其他行。

答案 2 :(得分:0)

  • 不需要else块,因为它将无法访问并且会 返回undefined

  • 已从x = x + z修正了x = x += z

  • 数组声明在外部,因此每次使用旧数据时 附加了来自for循环的更新数据。

 function range (x, y, z){

      let newarray = [];

      if (x === undefined || y === undefined || z === undefined ||  (x > y) || (z < 0)){
        return newarray;    
      }
      else if (y > x) { 
       for (x; x < y; x = x + z){
           newarray.push(x); 
        }
      }    
    return newarray;
      
    }
    console.log(range(0, 10, 2));
    console.log(range(10, 30, 5));
    console.log(range(-5, 2, 3));