JavaScriptにおいて、ある配列をもとにして別のオブジェクトを作成する場合、Array#reduce
を使用することが多い。
const input = ['foo', 'bar', 'baz'];
const result = input.reduce((accumulator, currentValue) => {
accumulator[currentValue] = capitalize(currentValue);
return accumulator;
}, {});
assert.deepStrictEqual(result, { foo: 'Foo', bar: 'Bar', baz: 'Baz' });
しかし例のように、単にキーと値の組み合わせにマッピングするだけなら、あえてArray#reduce
を使うまでもない。代わりにObject.fromEntries
を使えば、記述するコードをもっとシンプルにできる。
const input = ['foo', 'bar', 'baz'];
const result = Object.fromEntries(input.map((element) => [element, capitalize(element)]));
assert.deepStrictEqual(result, { foo: 'Foo', bar: 'Bar', baz: 'Baz' });
まず配列を「キーと値のペアからなる配列」([key, value][]
)に変換してから、それをObject.fromEntries
に渡すことでオブジェクト化できる。
Object.fromEntries
はObject.entries
の対になるメソッドである。Object.entries
は、オブジェクトを「キーと値のペアからなる配列」に変換するものであるのに対して、Object.fromEntries
はその逆に、「キーと値のペアからなる配列」をオブジェクトに変換する。
ついでに、TypeScriptではArray#reduce
を使うと型の取り扱いがやや煩雑になるが、Object.fromEntries
を使うとそのような問題が起こらない。