我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。

var foo = [];

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

对我来说,我觉得应该有一种不用循环的方法。


当前回答

感谢@NikoRuotsalainen的回答。我在我的实用程序中写道:

const range = ({from = 0, to, step = 1, length = Math.ceil((to - from) / step)}) => 
  Array.from({length}, (_, i) => from + i * step)

示例:常量范围=({from=0,to,step=1,length=Math.ceil((to-from)/step)})=>Array.from({length},(_,i)=>from+i*step)控制台日志(范围({长度:5}),//[0,1,2,3,4]范围({到:5}),//[0,1,2,3,4]范围({从:2,到:5}),//[2,3,4](包括“从”,不包括“到”)范围({从:2,长度:4}),//[2,3,4,5]范围({从:1到:5,步骤:2}),//[1,3]范围({从:1到:6,步骤:2}),//[1,3,5])

其他回答

function range(start, end) {
    var foo = [];
    for (var i = start; i <= end; i++) {
        foo.push(i);
    }
    return foo;
}

然后由调用

var foo = range(1, 5);

在Javascript中没有内置的方法来实现这一点,但如果您需要多次执行,则可以创建一个非常有效的实用程序函数。

编辑:在我看来,以下是一个更好的范围函数。也许只是因为我对LINQ有偏见,但我认为它在更多情况下更有用。您的里程数可能有所不同。

function range(start, count) {
    if(arguments.length == 1) {
        count = start;
        start = 0;
    }

    var foo = [];
    for (var i = 0; i < count; i++) {
        foo.push(start + i);
    }
    return foo;
}

有一个小功能,它允许使用像[1,2]。范围(3,4)->[1,2,3,4]也适用于负参数。享受

Array.prototype.range = function(from, to)
{
   var range = (!to)? from : Math.abs(to - from) + 1, increase = from < to;
   var tmp = Array.apply(this, {"length": range}).map(function()
      {
         return (increase)?from++ : from--;
      }, Number);

   return this.concat(tmp);
};

使用ES6的多种方式

使用扩展运算符(…)和键方法

[ ...Array(N).keys() ].map( i => i+1);

填充/贴图

Array(N).fill().map((_, i) => i+1);

排列自

Array.from(Array(N), (_, i) => i+1)

Array.from和{length:N}hack

Array.from({ length: N }, (_, i) => i+1)

关于广义形式的注记

通过将i+1更改为所需的表达式(例如i*2、-i、1+i*2和i%2等),上述所有形式都可以生成初始化为几乎任何所需值的数组。如果表达式可以用函数f表示,那么第一种形式就变得简单

[ ...Array(N).keys() ].map(f)

示例:

Array.from({length: 5}, (v, k) => k+1); 
// [1,2,3,4,5]

由于数组在每个位置都是用undefined初始化的,因此v的值将是undefineed

展示所有表格的示例

让演示=(N)=>{控制台日志([…数组(N).keys()].map((i)=>i+1),数组(N).fill().map((_,i)=>i+1),数组.from(数组(N),(_,i)=>i+1),Array.from({length:N},(_,i)=>i+1))}演示(5)

具有自定义初始化函数f的更通用示例,即。

[ ...Array(N).keys() ].map((i) => f(i))

甚至更简单

[ ...Array(N).keys() ].map(f)

让demo=(N,f)=>{控制台日志([…数组(N).keys()].map(f),数组(N).fill().map((_,i)=>f(i)),数组.from(数组(N),(_,i)=>f(i)),数组.从({长度:N},(_,i)=>f(i)))}演示(5,i=>2*i+1)

✅ 简单地说,这对我有用:

[...Array(5)].map(...)

试试看:

var foo = [1, 2, 3, 4, 5];

如果您正在使用CoffeeScript,可以通过执行以下操作创建范围:

var foo = [1..5]; 

否则,如果您使用的是普通JavaScript,那么如果要将数组初始化为可变长度,则必须使用循环。