【JavaScript】Array.mapでArray<object>を作りたい

【JavaScript】Array.mapでArray<object>を作りたい


# es2015 # javascript

前提

・ES2015(アロー関数を使用) ※アロー関数については、この記事が分かりやすい。

やりたいこと

・単純な配列や、オブジェクトの配列などから、新たなオブジェクトの配列を作りたい。 ・(他の部分はアロー演算子に統一されているなどで)ES2015で導入されたアロー関数を使ってモダンな書き方をしたい。

問題

通常のArray.map()は以下のように使う(リファレンスより)

var array1 = [1, 4, 9, 16];

// pass a function to map
const map1 = array1.map(x => x * 2);

console.log(map1);
// expected output: Array [2, 8, 18, 32]

しかし、この記法は本来return文を使って書くものを省略した形での記法となります。

以下、省略なしの形となります。

var array1 = [1, 4, 9, 16];

// pass a function to map
const map1 = array1.map(x => {return x * 2});

console.log(map1);
// expected output: Array [2, 8, 18, 32]

この形にする問題が見えてきますね。 この{}は、果たしてobjectを示すものなのか、それとも別のもの(上記は関数を示す)なのか判別出来なくなってしまいました。 さあ困ったというわけですが、解決方法は用意されているのです!

解決方法

解決方法は、オブジェクトを返すことを明示的に示すために、{}を()で囲うというシンプルなもの (備忘もかねて、オブジェクトのkeyに変数を使うやり方で書いています。)

const array = [
  {"key": "k1", "value": "v1"},
  {"key": "k2", "value": "v2"},
  {"key": "k3", "value": "v3"},
];
// ES2015以降は、[]で囲めば変数で使える。それ以前はブラケット記法で追加するので辛い。。
const objects = array.map(obj => ({ [obj.key] : obj.value }));

console.log(objects);
// [ { k1: "v1" }, { k2: "v2" }, { k3: "v3" } ]

参考ページ

https://hfuji.hatenablog.jp/entry/2016/06/28/232820

※上記ページはArray.mapの基本的な使い方もまとめられているので、使い方が怪しい方は目を通すと理解が進むと思います。

きっちり学びたい人は、定番ですがオライリー本がおすすめです。