配列とオブジェクトの相互変換

JavaScript では、配列とオブジェクトを相互に変換する場面がよくあります。Object のメソッドや Array のメソッドを組み合わせることで、柔軟なデータ変換が可能です。

オブジェクトから配列への変換

オブジェクトを配列に変換する方法は、何を取り出したいかによって使い分けます。

const user = { name: "田中", age: 25, city: "東京" };

// キーの配列
Object.keys(user);    // ["name", "age", "city"]

// 値の配列
Object.values(user);  // ["田中", 25, "東京"]

// [キー, 値] ペアの配列
Object.entries(user); // [["name", "田中"], ["age", 25], ["city", "東京"]]
メソッド戻り値
Object.keys()キーの配列
Object.values()値の配列
Object.entries()[キー, 値] の配列

配列からオブジェクトへの変換

[キー, 値] のペアからなる配列をオブジェクトに変換するには、Object.fromEntries() を使用します。

const entries = [
  ["name", "田中"],
  ["age", 25],
  ["city", "東京"]
];

const obj = Object.fromEntries(entries);
console.log(obj); // { name: "田中", age: 25, city: "東京" }

実践的な変換パターン

Object.entries() と Object.fromEntries() を組み合わせると、オブジェクトの変換処理を簡潔に書けます。

const prices = { apple: 100, banana: 80, orange: 120 };

// 全ての価格を1.1倍にする
const taxIncluded = Object.fromEntries(
  Object.entries(prices).map(([key, value]) => [key, value * 1.1])
);

console.log(taxIncluded);
// { apple: 110, banana: 88, orange: 132 }

配列をオブジェクトに変換(reduce 使用)

特定の条件でオブジェクトを構築する場合は、reduce() を使う方法もあります。

const users = [
  { id: 1, name: "田中" },
  { id: 2, name: "山田" },
  { id: 3, name: "佐藤" }
];

// id をキーにしたオブジェクトに変換
const userMap = users.reduce((acc, user) => {
  acc[user.id] = user;
  return acc;
}, {});

console.log(userMap);
// { 1: { id: 1, name: "田中" }, 2: { id: 2, name: "山田" }, ... }

Map との変換

Map オブジェクトとの相互変換も簡単に行えます。

// オブジェクト → Map
const obj = { a: 1, b: 2 };
const map = new Map(Object.entries(obj));

// Map → オブジェクト
const backToObj = Object.fromEntries(map);
オブジェクト → Map

Object.entries() で [キー, 値] の配列を作り、Map コンストラクタに渡します。

Map → オブジェクト

Map は iterable で [キー, 値] のペアを返すため、そのまま Object.fromEntries() に渡せます。

フィルタリングとの組み合わせ

オブジェクトのプロパティをフィルタリングする際にも、この変換パターンが活躍します。

const data = { a: 1, b: null, c: 3, d: undefined, e: 5 };

// null や undefined を除外
const cleaned = Object.fromEntries(
  Object.entries(data).filter(([key, value]) => value != null)
);

console.log(cleaned); // { a: 1, c: 3, e: 5 }

配列とオブジェクトの変換を自在に使いこなせると、データ処理の幅が大きく広がります。