這裡有兩種 compact 程式碼序列方式,來產生一個 [0, 1, ..., N-1]N 個元素的陣列:

方法一(ES5)

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

簡要說明

  1. Array.apply(null, {length: N) 回傳一個 N 個元素的陣列,裡面陣列元素都是為 undefined(i.e. A = [undefined, undefined, ...])。
  2. A.map(Function.call, Number) 回傳一個 N 個元素的陣列,索引 IFunction.call.call(Number, undefined, I, A) 取得結果。
  3. Function.call.call(Number, undefined, I, A) 轉變成 Number(I),這剛好就是 I
  4. 結果:[0, 1, ..., N-1]

更深入的解釋,請前往這裡

方法二(ES6)

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

簡要說明

  1. A = new Array(N) 回傳一個有 Nholes 的陣列(i.e. A = [,,,...],但是 x0...N-1A[x] = undefined)。
  2. F = (val, index) => index 等同於 function F (val, index) { return index; }
  3. Array.from(A, F) 回傳一個 N 個元素的陣列,索引 I 取得 F(A[I], I) 的結果,也就是 I
  4. 結果:[0, 1, ..., N-1]

還有一件事情

如果你真的想要排序 [1, 2, …, N],方法一改為:

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

方法二

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