小さい定数範囲の最適化 map()
状況
ES6から、範囲map()
ではなくfor
ループの代わりにメソッドを使用(および悪用)することがかなり一般的になりました[ 0 .. N− 1 ]、したがって、答え全体を機能的なスタイルで書くことができます:
for(i = 0; i < 10; i++) {
do_something_with(i);
}
次のいずれかに置き換えることができます。
[...Array(10).keys()].map(i => do_something_with(i))
またはより一般的に:
[...Array(10)].map((_, i) => do_something_with(i))
ただし、次の場合に使用することArray(N)
はめったに最適ではありません。N は小さな定数です。
範囲の最適化 [ 0 .. N− 1 ]、カウンター付き
以下は、カウンターが 私 コールバック内で使用されます:
N | Method | Example | Length
------------+--------------------------------------+---------------------------------+-------
N ≤ 6 | use a raw array of integers | [0,1,2,3].map(i=>F(i)) | 2N+10
N = 7 | use either a raw array of integers | [0,1,2,3,4,5,6].map(i=>F(i)) | 24
| or a string if your code can operate | [...'0123456'].map(i=>F(i)) | 23
| with characters rather than integers | |
8 ≤ N ≤ 9 | use scientific notation 1e[N-1] | [...1e7+''].map((_,i)=>F(i)) | 24
N = 10 | use scientific notation 1e9 | [...1e9+''].map((_,i)=>F(i)) | 24
| or the ES7 expression 2**29+'4' if | [...2**29+'4'].map(i=>F(i)) | 23
| the order doesn't matter and your | |
| code can operate with characters | (order: 5,3,6,8,7,0,9,1,2,4) |
| rather than integers | |
11 ≤ N ≤ 17 | use scientific notation 1e[N-1] | [...1e12+''].map((_,i)=>F(i)) | 25
N = 18 | use the fraction 1/3 | [...1/3+''].map((_,i)=>F(i)) | 24
N = 19 | use the fraction 1/6 | [...1/6+''].map((_,i)=>F(i)) | 24
20 ≤ N ≤ 21 | use scientific notation 1e[N-1] | [...1e20+''].map((_,i)=>F(i)) | 25
N = 22 | use scientific notation -1e20 | [...-1e20+''].map((_,i)=>F(i)) | 26
23 ≤ N ≤ 99 | use Array(N) | [...Array(23)].map((_,i)=>F(i)) | 27
注意:コールバックコードの長さはF(i)
カウントされません。
範囲の最適化 [ 1..9 ]、カウンター付き
範囲を反復処理する場合 [ 1..9 ] 順序は関係ありませんが、次のES7式を使用できます(コードが整数ではなく文字で動作できる場合)。
[...17**6+'8'].map(i=>F(i)) // order: 2,4,1,3,7,5,6,9,8; length: 23
カウンターなしの最適化
繰り返す必要がある場合は、次のメソッドを使用できます N カウンターを使用しない場合:
N | Method | Example | Length
------------+--------------------------------------+---------------------------------+-------
N ≤ 5 | use a raw array of integers | [0,0,0,0].map(_=>F()) | 2N+10
6 ≤ N ≤ 10 | use scientific notation 1e[N-1] | [...1e7+''].map(_=>F()) | 20
11 ≤ N ≤ 17 | use scientific notation 1e[N-1] | [...1e12+''].map(_=>F()) | 21
N = 18 | use the fraction 1/3 | [...1/3+''].map(_=>F()) | 20
N = 19 | use the fraction 1/6 | [...1/6+''].map(_=>F()) | 20
20 ≤ N ≤ 21 | use scientific notation 1e[N-1] | [...1e20+''].map(_=>F()) | 21
N = 22 | use scientific notation -1e20 | [...-1e20+''].map(_=>F()) | 22
23 ≤ N ≤ 99 | use Array(N) | [...Array(23)].map(_=>F()) | 23
注意:コールバックコードの長さはF()
カウントされません。