Pythonなら簡単にかける辞書内包表記をJavaScriptで実現したい
Pythonのリスト内包表記,辞書内包表記,便利ですよね.
冗長になりがちなfor文も
リスト内包表記
>>> [i * 2 for i in range(10)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
辞書内包表記
>>> {i: i * 2 for i in range(10)}
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
で一発です.
JavaScriptで実現しようとした場合,mapやfilterを使用してリスト内包表記を実現できることは知っていたのですが,辞書内包表記の書き方を知ることができたので,備忘録を残しておきます.
JavaScript(ES6)でリスト内包表記
辞書内包表記の前にリスト内包表記の確認をしておくと,上記の例では
[...Array(10).keys()].map((d) => {return d * 2});
で処理できますし,Pythonで
>>> [i * 2 for i in range(10) if i % 2 == 0]
[0, 4, 8, 12, 16]
のように,if文が入るようなものは,冗長にはなりますが,
[...Array(10).keys()].filter((d) => d % 2).map((d) => d * 2);
のように書くことができます.
JavaScript(ES6)で辞書内包表記
本命の辞書内包表記ですが,上記のPythonの例では
[...Array(10).keys()].reduce((obj, x) => Object.assign(obj, { [x]: x * 2 }), {})
のように書くことができます.一般化すると
array.reduce((obj, x) => Object.assign(obj, { [key_maker(x)]: value_maker(x) }), {})
となります.Pythonに比べるとだいぶ冗長ですが,それでもfor文を使うよりは簡潔に書ける機会が多いと思います.
参考
- In Javascript a dictionary comprehension, or an Object map https://stackoverflow.com/questions/11068247/in-javascript-a-dictionary-comprehension-or-an-object-map
- jsでrange関数をつくる http://qiita.com/akameco/items/a2b698dd4a067754997b