33

仅用一行生成[0, 1, ..., N-1]数列

我们可以创建一个函数,它可以仅用一行代码生成0…(N-1)数列。

使用下面一行代码,我们就可以生成0…(N-1)数列。

方法1 (需要 ES5)

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

简要说明

  1. Array.apply(null, {length: N}) 返回一个由undefined填充的长度为N的数组(例如 A = [undefined, undefined, ...])。
  2. A.map(Function.call, Number) 返回一个长度为N的数组,它的索引为I的元素为Function.call.call(Number, undefined, I, A)的结果。
  3. Function.call.call(Number, undefined, I, A)可转化为Number(I),正好就是I
  4. 结果为:[0, 1, ..., N-1]

更全面的介绍,请看这里.

方法2 (需要 ES6)

这里用到了Array.from https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from

 Array.from(new Array(N),(val,index)=>index);

简要说明

  1. A = new Array(N) 返回一个有N个_小孔_的数组 (例如 A = [,,,...], 但是对于x in 0...N-1A[x] = undefined)。
  2. F = (val,index)=>indexfunction F (val, index) { return index; }
  3. Array.from(A, F) 返回一个长度为N的数组,它的索引为I的元素为F(A[I], I)的结果,也就是I
  4. 结果为:[0, 1, ..., N-1]

One More Thing

如果你需要[1, 2, …, N]序列, 方法1 可改为:

Array.apply(null, {length: N}).map(function(value, index){
  return index + 1;
});

方法2可改为:

Array.from(new Array(N),(val,index)=>index+1);