我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。
var foo = [];
for (var i = 1; i <= N; i++) {
foo.push(i);
}
对我来说,我觉得应该有一种不用循环的方法。
我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。
var foo = [];
for (var i = 1; i <= N; i++) {
foo.push(i);
}
对我来说,我觉得应该有一种不用循环的方法。
当前回答
var foo=Array.from(数组(N),(v,i)=>i+1);
其他回答
使用ES2015/ES6排列运算符
[...Array(10)].map((_, i) => i + 1)
console.log([…数组(10)].map((_,i)=>i+1))
从1开始:
[...Array(31).keys()].map(a=>a+1)
由于有很多好的答案,这可能也是一个选项,您也可以使用下面的创建一个函数,它将适用于任何数字组合
const start = 10;
const end = 30;
const difference = Math.abs(start-end);
const rangeArray = new Array(difference + 1).fill(undefined).map((val, key) => {
return start > end ? start - key : start + key;
})
//不分配N大小数组(ES6,带有一些流注释)的解决方案:函数*zeroToN(N/*:数字*/)/*:生成器<number,void,empty>*/{对于(设n=0;n<=n;n+=1),得到n;}//通过这一代,您可以拥有您的阵列console.log([…zeroToN(10-1)])//但是让我们定义一个助手迭代器函数函数mapIterator(迭代器,映射){常量arr=[];for(let result=iterater.next()!result.done;result=iterator.next()){arr.push(映射(result.value));}返回arr;}//现在您有了一个map函数,不需要分配0…N-1数组console.log(mapIterator(zeroToN(10-1),n=>n*n));
感谢@NikoRuotsalainen的回答。我在我的实用程序中写道:
const range = ({from = 0, to, step = 1, length = Math.ceil((to - from) / step)}) =>
Array.from({length}, (_, i) => from + i * step)
示例:常量范围=({from=0,to,step=1,length=Math.ceil((to-from)/step)})=>Array.from({length},(_,i)=>from+i*step)控制台日志(范围({长度:5}),//[0,1,2,3,4]范围({到:5}),//[0,1,2,3,4]范围({从:2,到:5}),//[2,3,4](包括“从”,不包括“到”)范围({从:2,长度:4}),//[2,3,4,5]范围({从:1到:5,步骤:2}),//[1,3]范围({从:1到:6,步骤:2}),//[1,3,5])