我正在寻找以下方法的任何替代方法,以创建包含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)可能会更快。
其他回答
获取n个介于最小值和最大值之间的随机数的数组(虽然不是唯一的)
function callItWhatYouWant(n, min, max) {
return Array.apply(null, {length: n}).map(Function.call, function(){return Math.floor(Math.random()*(max-min+1)+min)})
}
试试看:
var foo = [1, 2, 3, 4, 5];
如果您正在使用CoffeeScript,可以通过执行以下操作创建范围:
var foo = [1..5];
否则,如果您使用的是普通JavaScript,那么如果要将数组初始化为可变长度,则必须使用循环。
问题是这个技术的替代方案,但我想分享更快的方法。它与问题中的代码几乎相同,但它分配内存而不是使用push:
function range(n) {
let a = Array(n);
for (let i = 0; i < n; a[i++] = i);
return a;
}
使用不修改Number.prototype的生成器函数的可移植版本。
函数序列(最大值,步长=1){返回{[Symbol.iiterat]:函数*(){对于(设i=1;i<=max;i+=步长),得出i}}}console.log([…序列(10)])
//不分配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));