TypeScript enum をオブジェクト配列へ
TypeScriptのenumをオブジェクト配列に変換する
TypeScriptでは、enumを使用して定数を定義することができます。これらの定数は、数値または文字列の値を持つことができます。しかし、場合によっては、enumの値をオブジェクト配列に変換する必要があることがあります。
基本的な方法
- 空の配列を作成します。
- enumの各値をループします。
- オブジェクトを作成し、そのプロパティとしてenumの値とキーを設定します。
- オブジェクトを配列に追加します。
例
enum Color {
Red = 'red',
Green = 'green',
Blue = 'blue'
}
const colorObjects: { value: string; key: string }[] = [];
for (const key in Color) {
if (isNaN(Number(key))) {
const value = Color[key];
colorObjects.push({ value, key });
}
}
console.log(colorObjects);
// Output: [{ value: 'red', key: 'Red' }, { value: 'green', key: 'Green' }, { value: 'blue', key: 'Blue' }]
より簡潔な方法 (ES6以降)
ES6以降では、Object.entriesメソッドを使用して、enumを直接オブジェクト配列に変換することができます。
const colorObjects = Object.entries(Color).map(([key, value]) => ({ key, value }));
console.log(colorObjects);
要点
- mapメソッドを使用して、各ペアをオブジェクトに変換します。
- Object.entriesメソッドは、enumをキーと値のペアの配列に変換します。
- isNaN関数を使用して、enumのキーが数値かどうかを確認します。
コード例1: for文を使った従来の方法
enum Color {
Red = 'red',
Green = 'green',
Blue = 'blue'
}
const colorObjects: { value: string; key: string }[] = [];
for (const key in Color) {
if (isNaN(Number(key))) {
const value = Color[key];
colorObjects.push({ value, key });
}
}
console.log(colorObjects);
// Output: [{ value: 'red', key: 'Red' }, { value: 'green', key: 'Green' }, { value: 'blue', key: 'Blue' }]
コード解説
- enumの定義
Color
という名前のenumを定義し、Red
、Green
、Blue
という3つの定数を文字列で定義しています。 - 空の配列の作成
colorObjects
という名前の空の配列を作成します。この配列に、enumの各値に対応するオブジェクトを格納していきます。 - for文によるループ
for...in
文を使用して、Color
enumの全てのキーをループします。 - 数値キーのスキップ
isNaN(Number(key))
で、キーが数値かどうかを判定し、数値キーの場合はスキップします。これは、enumのメンバーが数値インデックスを持つ場合があるためです。 - オブジェクトの作成と追加
value
プロパティにenumの値、key
プロパティにenumのキーを設定したオブジェクトを作成します。- 作成したオブジェクトを
colorObjects
配列に追加します。
- 結果の出力
console.log
で、最終的に作成されたcolorObjects
配列を出力します。
コード例2: ES6のObject.entriesを使った簡潔な方法
const colorObjects = Object.entries(Color).map(([key, value]) => ({ key, value }));
console.log(colorObjects);
- Object.entries
Object.entries(Color)
で、Color
enumをキーと値のペアの配列に変換します。 - map
変換された配列に対してmap
メソッドを使用し、各ペアを{ key, value }
という形式のオブジェクトに変換します。
どちらの方法でも、TypeScriptのenumをオブジェクト配列に変換することができます。
- Object.entriesを使った方法
ES6以降の機能を利用できる環境であれば、より簡潔で現代的な書き方です。 - for文を使った方法
より詳細な制御が必要な場合や、古いJavaScript環境で動作させる必要がある場合に適しています。
どちらの方法を選ぶかは、コードの可読性や、必要な機能によって決まります。
応用例
- enumの値をReactコンポーネントのpropsとして渡す
- enumの値をAPIのリクエストパラメータとして使用する
- enumの値をSelect要素のオプションとして表示する
さらに詳しく知りたい方へ
- map
配列の要素を別の配列に変換する方法について学ぶことができます。 - Object.entries
このメソッドの使い方や、他のオブジェクト操作に関するメソッドについて学ぶことができます。 - TypeScriptのenum
enumの定義方法や特徴について詳しく学ぶことができます。
reduceメソッドを使った方法
const colorObjects = Object.keys(Color).reduce((acc, key) => {
acc.push({ key, value: Color[key] });
return acc;
}, [] as { key: string; value: string }[]);
- reduce
初期値として空の配列を渡し、各キーに対してオブジェクトを作成して配列に追加していきます。 - Object.keys
enumの全てのキーを配列として取得します。
for...ofループを使った方法
for...of
ループは、配列の要素を順番に処理する際に便利です。
const colorObjects: { key: string; value: string }[] = [];
for (const key of Object.keys(Color)) {
colorObjects.push({ key, value: Color[key] });
}
- for...of
取得したキーの配列をループし、各キーに対してオブジェクトを作成して配列に追加していきます。
スプレッド構文とmapメソッドの組み合わせ
スプレッド構文とmapメソッドを組み合わせることで、より簡潔な表現が可能です。
const colorObjects = [...Object.keys(Color)].map(key => ({ key, value: Color[key] }));
- map
各キーに対してオブジェクトを作成します。 - スプレッド構文
Object.keys(Color)
の結果を配列に展開します。
どの方法を選ぶべきか?
- パフォーマンス
多くの場合、パフォーマンスの違いは無視できるほど小さいですが、大規模なデータ処理の場合は、それぞれの方法でベンチマークを取ってみることをおすすめします。 - 簡潔さ
スプレッド構文とmapメソッドの組み合わせは非常に簡潔ですが、少し複雑に見えるかもしれません。 - 可読性
for...in
ループは比較的わかりやすいですが、Object.entries
やreduce
を使った方がより関数的なスタイルで表現できます。
一般的には、Object.entries
を使った方法がバランスが取れており、多くのケースで推奨されます。 しかし、チームのコーディングスタイルや、個人の好みによって最適な方法は変わってくるので、状況に合わせて使い分けることが重要です。
TypeScriptのenumをオブジェクト配列に変換する方法は、様々な方法があります。それぞれの方法に特徴があり、状況に合わせて最適な方法を選択することができます。
重要なのは、コードの可読性と保守性を保ちながら、効率的な実装を行うことです。
より深く理解するためには、以下の点について調べてみると良いでしょう。
- スプレッド構文
スプレッド構文の様々な使い方 - for...of
for...ofループの仕組みと使い方 - Array.prototype.reduce
reduceメソッドの詳細な使い方
javascript arrays typescript