導入
JavaScriptで開発をしていると、オブジェクトに格納された「値」だけを配列として取り出したい場面によく遭遇します。従来はfor…in文を使ってループ処理を行い、キーを確認しながら値を抽出するという煩雑な手順が必要でした。しかし、ES2017(ES8)で導入された「Object.values」を使えば、たった1行で値を配列に変換できます。コードの可読性を高め、バグを減らすために必須のテクニックです。
基礎知識
Object.valuesは、引数として渡されたオブジェクトが持つ「自身の列挙可能なプロパティの値」を配列として返すメソッドです。
ここで重要なのは「列挙可能(Enumerable)」という点です。これはオブジェクトの各プロパティに設定されている属性で、通常の代入で作成されたプロパティは基本的にこれに該当します。また、返される配列の順序は、for…inループで得られる順序と同じになります。
実装/解決策
使い方は非常にシンプルです。Object.values(対象オブジェクト)と記述するだけです。これにより、オブジェクトの構造を気にせず、値のリストに対して配列メソッド(map、filter、reduceなど)を直感的に繋げることが可能になります。
サンプルプログラム
以下のコードは、商品在庫データを管理するオブジェクトから、現在の在庫数だけを抽出し、その合計を計算する実用的な例です。
// 商品の在庫状況を示すオブジェクト
const inventory = {
apple: 50,
banana: 30,
orange: 20
};
// Object.valuesを使って値だけを取り出し、配列に変換
const counts = Object.values(inventory);
console.log(counts); // 出力: [50, 30, 20]
// 配列になったので、reduceを使って合計値を算出
const totalStock = counts.reduce((sum, count) => sum + count, 0);
console.log("総在庫数: " + totalStock); // 出力: 総在庫数: 100
応用・注意点
現場で活用する際の注意点は以下の3つです。
1. プリミティブ値への対応:
Object.valuesに文字列を渡すと、文字ごとの配列が返されます。意図しない挙動を防ぐため、必ずオブジェクトが渡されることを確認しましょう。
2. Symbolプロパティの除外:
Object.valuesはキーがSymbolであるプロパティを無視します。もしSymbolも含めたい場合は、Object.getOwnPropertySymbolsを併用する必要があります。
3. プロトタイプチェーン:
このメソッドはオブジェクト自身が持つプロパティのみを対象とします。継承されたプロパティは含まれないため、意図せず古いデータが混入する心配はありません。
適切に使いこなすことで、データ加工のコードを驚くほどスッキリと書くことができます。ぜひ今日の開発から取り入れてみてください。