JavaScriptでオブジェクト配列をidをキーとするオブジェクトに変換する方法
JavaScriptでは、オブジェクトの配列を「キーが各オブジェクトのプロパティ値であるオブジェクト」へ変換したいケースがよくあります。本記事では、id プロパティをキーとして使う変換方法を解説します。
前提となるデータ
まず、次のようなオブジェクトの配列を想定します。
const arr = [{id:1,name:"aa"},{id:2,name:"bb"},{id:3,name:"cc"}];要件
この配列を受け取り、各オブジェクトの id プロパティの値をキーとしたオブジェクトを返す関数を作成します。期待される出力は以下の通りです。
const output = {1:{name:"aa"},2:{name:"bb"},3:{name:"cc"}};ポイントは、サブオブジェクトのマッピングに使用した id プロパティそのものを、結果のサブオブジェクトから削除する点です。これにより、元データの情報が重複せず、クリーンな構造になります。
実装コード
この処理を実現するコードは以下の通りです。
const arr = [{id:1,name:"aa"},{id:2,name:"bb"},{id:3,name:"cc"}];
const arrayToObject = arr => {
const res = {};
for(let i = 0; i < arr.length; i++){
const key = arr[i]['id'];
res[key] = arr[i];
delete res[key]['id'];
};
return res;
};
console.log(arrayToObject(arr));処理の流れ
この関数の動作を順番に見ていきましょう。
1. 結果を格納するための空オブジェクト res を用意します。
2. 配列の要素をループで順に取り出し、各オブジェクトの id の値を変数 key に代入します。
3. res[key] に対象のオブジェクトを格納します。
4. delete 演算子を使って、格納後のオブジェクトから id プロパティを削除します。
5. ループ完了後、res を返り値として返します。
実行結果
コンソールには次のように出力されます。
{ '1': { name: 'aa' }, '2': { name: 'bb' }, '3': { name: 'cc' } }なお、オブジェクトのキーは文字列として扱われるため、数値の id を指定しても出力上はシングルクォート付きの文字列キー(例: '1')として表示されます。動作上は問題なく、output[1] のようにアクセスできます。
補足:reduceを使った別解
より関数型的なアプローチとして、Array.prototype.reduce() を使って同様の変換を行うこともできます。
const arrayToObject = arr =>
arr.reduce((acc, { id, ...rest }) => {
acc[id] = rest;
return acc;
}, {});スプレッド構文と分割代入を組み合わせることで、id 以外のプロパティだけを抽出でき、より簡潔に記述できます。用途やチームのコーディングスタイルに合わせて使い分けるとよいでしょう。
-
JavaScriptのlengthプロパティで配列オブジェクトの長さを取得する方法
JavaScriptにおけるlengthプロパティとはJavaScriptのlengthプロパティは、文字列や配列などのオブジェクトが持つ要素数(サイズ)を返すために使用されます。配列の場合は格納されている要素の個数、文字列の場合は文字数を取得できます。ここでは、文字列と配列オブジェクトの長さをlengthプロパティで取得するサンプルコードを紹介します。サンプルコード以下の例では、ボタンをクリックすると配列の長さが画面に表示される仕組みを実装しています。<!DOCTYPE html> <html lang="ja"> <head> <
-
JavaScriptで配列をSet(セット)に変換する方法
JavaScriptで配列をSetに変換するときの基本JavaScriptでは、Setオブジェクトを使うことで、配列から重複しない一意の値だけを持つコレクションを簡単に作成できます。SetはES6(ECMAScript 2015)で導入された組み込みオブジェクトで、同じ値が複数回追加されても自動的に1つにまとめられるのが特徴です。変換自体は非常にシンプルで、new Set(配列)と書くだけで完了します。コード例:配列からSetへの変換以下は、重複を含む配列をSetに変換して画面に表示するサンプルコードです。<!DOCTYPE html> <html lang=ja> &