ネットで見つけた方法は
どうやら下記コードで目的は達成できるらしい。
new Array(10).fill(0).map(() => 0)
// => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
いったい、どうしてこうなるのか。
何が行われているのか?
new Array()
かっこの中に入れたLength
分の配列を作成する。
つまりnew Array(10)
であれば10個の値を含む配列を作成してくれる。
ちなみに値はundefined
になる
[undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]
fill()
fill() メソッドは、開始位置(既定値は 0)から終了位置(既定値は array.length)までのすべての要素を、静的な値に変更した配列を返します。
つまり先ほど作った10個のundefined
を持つ配列のundefined
を0
に変更してくれるということ?
console.log(new Array(10).fill(0))
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ということらしい。
この時点でタイトル(n個の任意の値を持つ配列を作成する)という目的は達成されている。
いったいmap()
は何をしているのか?
map()
このコードでいえばmap()
は配列の個数分取り出して0
を入れるという、まったく生産性のない動きをしている。
つまり本タイトルという目的を達成するためであれば、不要以外の何物でもない。
n個の任意の値を持つ配列を作成する方法
ということで結論は、
console.log(new Array(10).fill(0))
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
に落ち着いた。
map()が必要な場合は?
ちなみにmap()
が必要な時は、必要とする値がオブジェクトの時らしい。
javascript fillでオブジェクトの配列を作成した際の注意点
上に詳しく説明されているけど、どうやら指定した個数分参照渡しされているということ。 つまり、3つの配列を作り、その2番目のkey
を変更しようとしたところ、すべてのkey
が変更される結果になる。
const v = new Array(3).fill({hello: 'Hello', world:'World'})
v[2].hello = 'goodbye'
console.log(v)
// [
// {
// "hello": "goodbye",
// "world": "World"
// },
// {
// "hello": "goodbye",
// "world": "World"
// },
// {
// "hello": "goodbye",
// "world": "World"
// }
// ]
そのため、map
で入れなおす必要がある。
念のためシンプルな個数分の配列で行ったけど、問題なかった。
const v = new Array(10).fill(0)
v[2] = 2
console.log(v)
// (10) [0, 0, 2, 0, 0, 0, 0, 0, 0, 0]
オブジェクトの時だけことは起こるらしい。