我正在寻找以下方法的任何替代方法,以创建包含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);
}
对我来说,我觉得应该有一种不用循环的方法。
当前回答
问题是这个技术的替代方案,但我想分享更快的方法。它与问题中的代码几乎相同,但它分配内存而不是使用push:
function range(n) {
let a = Array(n);
for (let i = 0; i < n; a[i++] = i);
return a;
}
其他回答
有一个小功能,它允许使用像[1,2]。范围(3,4)->[1,2,3,4]也适用于负参数。享受
Array.prototype.range = function(from, to)
{
var range = (!to)? from : Math.abs(to - from) + 1, increase = from < to;
var tmp = Array.apply(this, {"length": range}).map(function()
{
return (increase)?from++ : from--;
}, Number);
return this.concat(tmp);
};
在ES6中:
Array.from({length: 1000}, (_, i) => i).slice(1);
或者更好(没有额外的变量_,也没有额外的切片调用):
Array.from({length:1000}, Number.call, i => i + 1)
或者,如果您的列表少于256个结果,您可以使用Uint8Array来获得稍快的结果(或者,您可以根据列表的长度使用其他Uint列表,例如Uint16的最大值为65535,或Uint32的最大值4294967295等。不过,正式地说,这些类型的数组只是在ES6中添加的)。例如:
Uint8Array.from({length:10}, Number.call, i => i + 1)
ES5:
Array.apply(0, {length: 1000}).map(function(){return arguments[1]+1});
或者,在ES5中,对于map函数(类似于上面ES6中Array.from函数的第二个参数),可以使用Number.call
Array.apply(0,{length:1000}).map(Number.call,Number).slice(1)
或者,如果你在这里也反对.sslice,你可以执行上面的ES5等效操作(来自ES6),比如:
Array.apply(0,{length:1000}).map(Number.call, Function("i","return i+1"))
你可以这样做:
var arr=数组.from(数组(10).keys())arr.shift()控制台日志(arr)
由于有很多好的答案,这可能也是一个选项,您也可以使用下面的创建一个函数,它将适用于任何数字组合
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;
})
使用不修改Number.prototype的生成器函数的可移植版本。
函数序列(最大值,步长=1){返回{[Symbol.iiterat]:函数*(){对于(设i=1;i<=max;i+=步长),得出i}}}console.log([…序列(10)])