我正在寻找以下方法的任何替代方法,以创建包含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]
其他回答
你可以这样做:
var arr=数组.from(数组(10).keys())arr.shift()控制台日志(arr)
如果我得到了你想要的,你需要一个数字数组1..n,以后可以循环使用。
如果这就是你所需要的,你能代替它吗?
var foo = new Array(45); // create an empty array with length 45
然后当你想使用它时…(例如,未优化)
for(var i = 0; i < foo.length; i++){
document.write('Item: ' + (i + 1) + ' of ' + foo.length + '<br/>');
}
例如,如果你不需要在数组中存储任何东西,你只需要一个长度合适的容器,你可以遍历它。。。这可能更容易。
请在此处查看实际操作:http://jsfiddle.net/3kcvm/
使用ES6标准中的新Array方法和=>函数语法(编写时仅限Firefox)。
通过用未定义的:
Array(N).fill().map((_, i) => i + 1);
Array.from将“孔”转换为未定义,因此Array.map按预期工作:
Array.from(Array(5)).map((_, i) => i + 1)
问题是这个技术的替代方案,但我想分享更快的方法。它与问题中的代码几乎相同,但它分配内存而不是使用push:
function range(n) {
let a = Array(n);
for (let i = 0; i < n; a[i++] = i);
return a;
}
尝试在Number的原型中添加迭代器。
Number.prototype[Symbol.iterator] = function *(){
let i = 0;
while(i < this) yield i++;
return;
}
现在数字是可迭代的,只需将一个数字传递给Array.from
Array.from(10);//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
或者任何其他需要迭代的地方,比如。。。循环。
for(const number of 10) console.log(number);//logs 0 through 9 sequentially
这有点复杂,但也很酷。