[{id: 1, name: "hoge"}, {id: 2, name: "fuga"}]
のような配列を{ 1 : {id:1, name: "hoge"}, 2 : { id: 2, name: "fuga" }}
のようなid
をキーにそれに対応するオブジェクトが値になっているように変換したい時のメモになります。
このutil関数が欲しかった背景としては、reducer内でデータを扱いやすいようにオブジェクトから配列に変換したり、stateに変更を反映させるために配列からオブジェクトに変換することが度々あったからです。
// 配列からオブジェクト(プロパティにidを保持している)に変換する
const fromArrayToObject = <T extends Readonly<{ id: number }>>(
items: ReadonlyArray<T>
): Readonly<{ [id: number]: T }> =>
items.reduce<{ [id: number]: T }>((map, item) => {
map[item.id] = item
return map
}, {})
使用例
type Todo = Readonly<{
id: number
title: string
done: boolean
}>
const todoList: ReadonlyArray<Todo> = [
{ id: 1, title: "ラーメン食べる", done: false },
{ id: 2, title: "二郎を食べる", done: false }
]
const result = fromArrayToObject(todoList)
/*
出力結果
{
'1': { id: 1, title: 'ラーメン食べる', done: false },
'2': { id: 2, title: '二郎を食べる', done: false }
}
*/