创建一个包含1 ... N的JavaScript数组

我正在寻找下面的任何替代方法来创建一个包含1到N的JavaScript数组,其中N只在运行时才为人所知。

var foo = [];

for (var i = 1; i <= N; i++) {
   foo.push(i);
}

对我来说,感觉就像没有循环一样,应该有这样做的方法。


如果我得到你以后的东西,你需要一个数组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/


你可以这样做:

var N = 10; 
Array.apply(null, {length: N}).map(Number.call, Number)

结果:[0,1,2,3,4,5,6,7,8,9]

或随机值:

Array.apply(null, {length: N}).map(Function.call, Math.random)

结果:[0.7082694901619107,0.95222225909214467,0.85386714542729765,0.8653848143294454,0.008339877473190427,0.9911756622605026,0.8133423360995948,0.8377588465809822,0.5577575915958732,0.1363654541783035]

说明

首先请注意, Number.call(undefined, N)等价于Number(N)Number.call(undefined, N)返回N 我们稍后会使用这个事实。

Array.apply(null, [undefined, undefined, undefined])等同于Array(undefined, undefined, undefined) ,它产生一个三元素数组并为每个元素赋值undefined

你怎么能把它推广到N个元素? 考虑Array()是如何工作的,如下所示:

function Array() {
    if ( arguments.length == 1 &&
         'number' === typeof arguments[0] &&
         arguments[0] >= 0 && arguments &&
         arguments[0] < 1 << 32 ) {
        return [ … ];  // array of length arguments[0], generated by native code
    }
    var a = [];
    for (var i = 0; i < arguments.length; i++) {
        a.push(arguments[i]);
    }
    return a;
}

由于ECMAScript 5, Function.prototype.apply(thisArg, argsArray)也接受鸭型数组对象作为其第二个参数。 如果我们调用Array.apply(null, { length: N }) ,那么它将执行

function Array() {
    var a = [];
    for (var i = 0; i < /* arguments.length = */ N; i++) {
        a.push(/* arguments[i] = */ undefined);
    }
    return a;
}

现在我们有一个N元素数组,每个元素都设置为undefined 。 当我们调用.map(callback, thisArg)时,每个元素都将被设置为callback.call(thisArg, element, index, array) 。 因此, [undefined, undefined, …, undefined].map(Number.call, Number)会将每个元素映射到(Number.call).call(Number, undefined, index, array) ,这与Number.call(undefined, index, array) ,正如我们前面所观察的那样,它评估为index 。 这完成了其元素与其索引相同的数组。

为什么要经历Array.apply(null, {length: N})的麻烦而不是Array(N) ? 毕竟,这两个表达式都会产生一个未定义元素的N元素数组。 不同的是,在前一个表达式中,每个元素都明确地设置为未定义,而在后者中,每个元素从未设置。 根据.map()的文档:

仅对已分配值的数组索引调用callback ; 对于已删除或从未分配过值的索引,不会调用它。

因此, Array(N)不足; Array(N).map(Number.call, Number)将导致长度为N的未初始化数组。

兼容性

由于此技术依赖于ECMAScript 5中指定的Function.prototype.apply()行为,因此它不适用于ECMAScript 5之前的浏览器,例如Chrome 14和Internet Explorer 9。


在ES6中使用Array()和keys()方法。

Array.from(Array(10).keys())
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

使用扩展运算符的较短版本。

[...Array(10).keys()]
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
链接地址: http://www.djcxy.com/p/52045.html

上一篇: Create a JavaScript array containing 1...N

下一篇: Use For loop inside JSX