# Javascriptで任意の値を持つn個の配列を作成する

4 min read
Table of Contents

ネットで見つけた方法は

どうやら下記コードで目的は達成できるらしい。

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を持つ配列のundefined0に変更してくれるということ?

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]

オブジェクトの時だけことは起こるらしい。

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

# Angularでコンポーネントを再レンダリングする

2 min read

色々な状況が複雑に絡み合っていた。ある処理を行ったあと、初期表示に戻したいという要件があり、それじゃあということで、表示用にデータを作り直したりと色々手を尽くしたが、前述したように色々な状況が複雑に絡み合っていせいで、どうにもできなかった。

Read

# Dockerに座学でざっくり入門してみる

5 min read

※この記事を書いているのはフロントエンドを専門にしているので、バックエンド側の「いろは」は何も知りません。フロント専がDockerとはいったいと頭を抱えつつ、ざっくり入門する記事になります。

Read

Comments