LoginSignup
2
2

More than 5 years have passed since last update.

key-valueオブジェクトの配列をオブジェクト型に変化する

Posted at

はじめに

とあるシステム開発をしていたら、以下に示すようなデータ変換をしたくなりました。

// 変換前
[
  {
    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
}

となります。これですべての配列を一つにまとめてオブジェクトにすることができるようになります。

終わりに

これだけ書くにも、結構疲れるもんですね。こう言うのって人に説明するのが難しい。

2
2
0

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
2
2