我正在寻找以下方法的任何替代方法,以创建包含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/

其他回答

Object.keys(Array.apply(0,Array(3))).map(Number)

返回[0,1,2]。与伊戈尔·舒宾(Igor Shubin)的出色回答非常相似,但略少了一些诡计(并且长了一个角色)。

说明:

数组(3)//[未定义×3]生成长度n=3的数组。不幸的是,这个阵列对我们几乎毫无用处,所以我们必须…Array.apply(0,Array(3))//[未定义,未定义,undefined]使数组可迭代。注意:null作为apply的第一个参数更常见,但0更短。Object.keys(Array.apply(0,Array(3)))//[“0”,“1”,“2”]然后获取数组的键(因为数组是数组的类型)。数组是带有键索引的对象。Object.keys(Array.apply(0,Array(3))).map(Number)//[0,1,2]并映射到键上,将字符串转换为数字。

如果我得到了你想要的,你需要一个数字数组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/

我在寻找一个功能性的解决方案,最终得到了:

function numbers(min, max) {
  return Array(max-min+2).join().split(',').map(function(e, i) { return min+i; });
}

console.log(numbers(1, 9));

注意:join().split(',')将稀疏数组转换为连续数组。

似乎目前唯一没有出现在这个相当完整的答案列表中的味道是一个生成器;以便补救:

const gen = N => [...(function*(){let i=0;while(i<N)yield i++})()]

其可以这样使用:

gen(4) // [0,1,2,3]

这件事的好处是你不需要增加。。。要从@igor shubin给出的答案中获得灵感,您可以非常容易地创建一系列随机数:

const gen = N => [...(function*(){let i=0;
  while(i++<N) yield Math.random()
})()]

而不是像这样的冗长的运营成本高昂的事情:

const slow = N => new Array(N).join().split(',').map((e,i)=>i*5)
// [0,5,10,15,...]

您可以改为:

const fast = N => [...(function*(){let i=0;while(i++<N)yield i*5})()]

以下函数返回一个由数字填充的数组:

var createArrayOfNumbers = function (n) {
    return Array.apply(null, new Array(n)).map(function (empty, index) {
        return index;
    });
};

请注意,使用数组构造函数创建的数组由孔组成,因此不能使用map等数组函数遍历。因此使用Array.apply函数。