我正在寻找以下方法的任何替代方法,以创建包含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);
}
对我来说,我觉得应该有一种不用循环的方法。
当前回答
我发现了这条旧线索,因为我自己也在想同样的问题,但我想这里没有一个答案比Kokodoko评论的原始示例更容易,哈哈!
我最终自己使用了这个方法:
var foo = [];
while (foo.length < N)
foo.push( foo.length + 1 );
这至少比常规的for循环稍微快一点,而且希望不容易出错(尽管在计算上可能更昂贵)。
甚至可以做以下事情:
var foo= [];
while (foo.length < N)
foo.push( foo.length%4 + 1 );
以按顺序将阵列填充1-4次。或者使用此方法用单个项填充数组,尽管我想在这种情况下,只使用array(N).fill(x)可能会更快。
其他回答
基于高票答案和高票评论。
const range = (from, to) => [...Array(to + 1).keys()].slice(from);
// usage
let test = [];
test = range(5, 10);
console.log(test); // output: [ 5, 6, 7, 8, 9, 10 ]
问题是这个技术的替代方案,但我想分享更快的方法。它与问题中的代码几乎相同,但它分配内存而不是使用push:
function range(n) {
let a = Array(n);
for (let i = 0; i < n; a[i++] = i);
return a;
}
我没有看到任何基于递归函数的解决方案(我自己也从未编写过递归函数),所以这里是我的尝试。
注意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)})
我会用。。。数组(N).keys()
var foo=[…Array(5).keys()].map(foo=>foo+1)console.log(foo)
可以使用函数生成器或函数*表达式。这里是[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]