21
7

More than 3 years have passed since last update.

[...Array(10).keys()].map(i => ++i) ??

Last updated at Posted at 2019-05-15

環境

node -v
v9.10.0

※ バージョンによって挙動が違うようです。ご注意下さい。
コメント欄にて教えていただきました!

※ TypeScriptの場合はこちら

やったこと


> [...Array(10).keys()].map(i => ++i)
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

処理結果はわかったけど、処理内容がわからない。

> Array(10)
[ <10 empty items> ]

10 empty items
???

配列の中身が undefined すら入っていない「空き枠」の状態

なるほど。

こんな感じか

[ , , , , , , , , ]

試しに要素の数をだす

> Array(10).length
10

ウンウン。空き枠はある


> Array(10).keys()
{}

...ふむ

公式より
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


// simple array
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']

// array like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

なるほど、objectのキーがあればキーを出力する。キーが指定されてなかったら0から順にってことか。
内部的にキーがあるんだろうか


> Array(10).keys()
{}

これだと、、、なんで出力されないのかな???
わからん
さっきの結果からするにarrayの「空き枠」はある。

空き枠じゃ無理なのか
undefinedならいける?


> [...Array(10)]
[ undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined ]
> [...Array(10)].keys()
{}

無理でした

なんだこれは。。。。。。


> let obj = {
...     name: 'Krunal',
...     education: 'IT Engineer'
... } ;
undefined
> console.log(Object.keys(obj));
[ 'name', 'education' ]
undefined

こんな感じで使うみたいです。


> const a = [...Array(10)]
undefined
> a
[ undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined ]
> Object.keys(a)
[ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
> Object.keys([...Array(10)])
[ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
>

できたできた


> [...Array(10)]
[ undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined ]
> [...Array(10).keys()]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

これはスプレッド演算子

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax
スプレッド構文を使うと、関数呼び出しでは 0 個以上の引数として、Array リテラルでは 0 個以上の要素として、Object リテラルでは 0 個以上の key-value のペアとして、Array や String などの iterable オブジェクトをその場で展開します。

今回はArrayリテラルだから、要素として展開
...Array(10)で展開されるundefinedにキーが指定されてないから、0から順に展開


> [...Array(10).keys()].map(i => ++i)
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

さっきの結果から、中身を1個ずつ取り出して、++iで+1して順番に出力

https://codeburst.io/javascript-map-vs-foreach-f38111822c0f
foreach vs map
foreachだと中身を取り出して使う。
mapだと中身を取り出して使う。そして、配列を出力って感じか


> [...Array(10).keys()].forEach(i => ++i)
undefined
> [...Array(10).keys()].forEach(i => console.log(i))
0
1
2
3
4
5
6
7
8
9
undefined

TypeScriptでやりたいんだよね

適当に配列作りたいなと思って、ググったら自分の記事がヒットしたわけですが、上記方法ではTypeScriptでエラーが出ます。

Type 'IterableIterator<number>' is not an array type or a string type. Use compiler option '--downlevelIteration' to allow iterating of iterators.ts(2569)

とりあえず解決するには以下です。

[...Array.from(Array(10).keys())].map(a => console.log(a))

もしくは

[...(Array(10).keys() as any)].map(a => console.log(a))
21
7
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
7