はじめに
とあるシステム開発をしていたら、以下に示すようなデータ変換をしたくなりました。
// 変換前
[
{
key: 'hp',
value: 1000
},
{
key: 'power',
value: 800
},
{
key: 'defense',
value: 500
},
]
// 変換後
{
hp: 1000,
power: 800,
defense: 500
}
検索の仕方が悪かったのか、中々それっぽいサンプルに出会えずにいました。なので、自分で考えたら何とか思いついたので、備忘録代わりに記事を書くことにしました。
実際のコード
let param = [
{key: 'hp', value: 1000},
{key: 'power', value: 800},
{key: 'defense', value: 500}
];
let convertArrayToObj = R.pipe(
// (1) map処理
R.map((item)=>({[item.key]: item.value})),
// (2) reduce処理
R.reduce(R.merge, {})
);
convertArrayToObj(param);
ramdaで書いてみました。ここで実際に動かすこともできます。
簡単な解説
(1)map処理
まずはmap処理でparamを以下のように変換します。
[{hp: 1000}, {power: 800}, {defense: 500}]
(2)reduce処理
次にreduceで配列を一つにまとめています。reduceとは配列の中をすべて足すなど、配列を一つにまとめる計算をする処理のことです。例えば、数字配列をすべて足し算する場合は
let array = [1,2,3,4,5];
R.reduce(R.add, 0, array);
となります。R.reduceの初めの引数にはどのような一つにまとめるかの処理を、2つ目の引数には初期値を設定しています。上記コードではR.mergeと書きましたが、これはオブジェクト同士を合成するという意味です。例えば、
R.merge({hp: 1000}, {power: 800})
と書くと
{
hp: 1000,
power: 800
}
となります。これですべての配列を一つにまとめてオブジェクトにすることができるようになります。
終わりに
これだけ書くにも、結構疲れるもんですね。こう言うのって人に説明するのが難しい。