我正在尝试编写一个程序,该程序创建一个数组并将其填充一系列数字。函数范围的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));
现在,它为所有三个数字生成未定义的。我的研究提出了一些关于异步性的东西?我不确定这是什么意思。
答案 0 :(得分:2)
一些事情在这里发挥作用:
newArray
应该在函数范围内定义,而不是全局变量。否则,对函数的后续调用将继续追加到同一数组上,这可能不是您的意图(如果是,则为array.concat()
)。
您的最后一个else
无法访问,因此该函数将为验证失败的输入返回空数组,或者在将数组填充到其中后控件到达函数末尾时返回undefined
else if
块。
x = x += z
的意图可能是x += z
。
您应该禁止使用z === 0
,否则您将陷入无限循环。
普通的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));