我正在寻找以下方法的任何替代方法,以创建包含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);
}
对我来说,我觉得应该有一种不用循环的方法。
当前回答
可以使用函数生成器或函数*表达式。这里是[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function]以及对函数生成器链接的引用[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function].
设a=1,b=10;
函数*范围(a,b){对于(var i=a;i<=b;++i)收益率i;}
数组.来自(范围(a,b));// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[…范围(a,b)]// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
其他回答
我没有看到任何基于递归函数的解决方案(我自己也从未编写过递归函数),所以这里是我的尝试。
注意array.push(something)返回数组的新长度:
(a=[]).push(a.push(a.push(0))) // a = [0, 1, 2]
使用递归函数:
var a = (function f(s,e,a,n){return ((n?n:n=s)>e)?a:f(s,e,a?a:a=[],a.push(n)+s)})(start,end) // e.g., start = 1, end = 5
编辑:其他两种解决方案
var a = Object.keys(new Int8Array(6)).map(Number).slice(1)
and
var a = []
var i=setInterval(function(){a.length===5?clearInterval(i):a.push(a.length+1)})
试试看:
var foo = [1, 2, 3, 4, 5];
如果您正在使用CoffeeScript,可以通过执行以下操作创建范围:
var foo = [1..5];
否则,如果您使用的是普通JavaScript,那么如果要将数组初始化为可变长度,则必须使用循环。
Array(8).fill(0).map(Number.call, Number)
偷取Igors数字。可以使用技巧,但使用fill()稍微缩短。仅适用于ES6及以上版本。
ES6中还有另一种方法,使用Array.from,它接受两个参数,第一个是arrayLike(在本例中是具有长度属性的对象),第二个是映射函数(在本示例中,我们将项映射到其索引)
Array.from({length:10}, (v,i) => i)
它更短,可用于生成偶数等其他序列
Array.from({length:10}, (v,i) => i*2)
此外,这比大多数其他方式具有更好的性能,因为它只在阵列中循环一次。查看截图以进行一些比较
//打开开发控制台以查看结果计数=100000console.time(“来自对象”)for(设i=0;i<count;i++){range=Array.from({length:10},(v,i)=>i)}console.timeEnd(“来自对象”)console.time(“来自按键”)for(设i=0;i<count;i++){range=Array.from(Array(10).keys())}console.timeEnd(“来自按键”)console.time(“应用”)for(设i=0;i<count;i++){range=Array.apply(null,{length:10}).map(函数(元素,索引){return index;})}console.timeEnd(“应用”)
有一个小功能,它允许使用像[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);
};