🖇️

APIレスポンスにありがちなObjectのArrayをreduce()でObjectに整形し直す

2021/05/25に公開2

やりたいこと

タイトルのまんまですが、例えば下記のようなkeyvalueというプロパティを持つオブジェクトの配列が与えられたときに、{key1: value1, key2: value2, ...}なオブジェクトを得たいケースがありました。

// もとの形
resp = [{key: 'animal', value: 'run'}, {key: 'fish', value: 'swim'}]

// ほしい形
ans = {animal: 'run', fish: 'swim'}

解法

いくらでもやり方はあると思いますが、勉強がてらreduceを使って下記のように実装しました。

resp = [{key: 'animal', value: 'run'}, {key: 'fish', value: 'swim'}]
const reducer = (dict, current) => {
	const key = current.key
	const value = current.value
	dict[key] = value
  	return dict
}
//               callback, initialValue
ans = resp.reduce(reducer, {})

ポイントだなと思ったのは、reduce(callback, initialValue)initialValueとして空のオブジェクトを指定することです。これを入れないと狙い通りに動作しません。

GitHubで編集を提案

Discussion

urinurin

こうも書けますね。

ans = Object.fromEntries(resp.map(({key, value}) => [key, value]))