読み込み中...

JavaScriptでオブジェクトと配列を簡単変換!5つの方法とサンプルコード

JavaScriptでオブジェクトと配列を変換する方法 JS
この記事は約18分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

JavaScriptにおいて、オブジェクトと配列の変換技術を習得することが重要です。

本記事では、初心者の方々にも理解しやすいよう、基本概念から実践的な変換手法まで、段階的に解説していきます。

JavaScriptのデータ構造において、オブジェクトと配列は頻繁に使用される要素です。

両者の特性を理解し、適切に変換できるスキルを身につけることで、より柔軟で効率的なコーディングが可能となります。

●JavaScriptのオブジェクトと配列

それでは、オブジェクトと配列の基本的な概念から学んでいきましょう。

○オブジェクトの定義と特徴

JavaScriptにおけるオブジェクトは、キーと値のペアを格納するデータ構造です。

各キーは一意であり、対応する値へのアクセスに使用されます。オブジェクトの作成には、オブジェクトリテラル表記が用いられます。

例えば、次のようにオブジェクトを作成できます。

const person = {
  name: '山田太郎',
  age: 30,
  occupation: 'エンジニア'
};

この例では、personというオブジェクトに、名前、年齢、職業の情報が格納されています。

各情報には、対応するキーを用いてアクセスできます。

○配列の定義と特徴

一方、配列は値のリストを順序付けて格納するデータ構造です。

各要素にはインデックスが割り当てられ、このインデックスを使用して要素にアクセスします。

配列の作成には、配列リテラル表記が使用されます。

const fruits = ['りんご', 'バナナ', 'オレンジ'];

この例では、fruitsという配列に3つの果物名が格納されています。

各要素には、0から始まるインデックスを用いてアクセスできます。

オブジェクトと配列の基本を理解したところで、次はこれらの変換方法について詳しく見ていきましょう。

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

オブジェクトから配列への変換には複数の方法があります。

ここでは、代表的な3つの手法を紹介します。

それぞれの特徴と使用場面を理解することで、適切な変換方法を選択できるようになります。

○Object.keys()メソッドを使用した変換

Object.keys()メソッドは、オブジケトのすべてのキーを配列として取得する方法です。

このメソッドは、オブジェクトの構造を把握したい場合や、キーのみを利用する処理を行う際に有用です。

ここでは、Object.keys()メソッドの使用例を紹介します。

const book = {
  title: 'JavaScriptマスターへの道',
  author: '佐藤花子',
  pages: 300
};

const bookProperties = Object.keys(book);
console.log(bookProperties); // ['title', 'author', 'pages']

この例では、bookオブジェクトのキーが配列として取得され、bookPropertiesに格納されています。

○Object.values()メソッドを使用した変換

Object.values()メソッドは、オブジェクトのすべての値を配列として取得します。

このメソッドは、オブジェクトの値のみを使用して処理を行う場合に適しています。

Object.values()メソッドの使用例は次の通りです。

const car = {
  brand: 'トヨタ',
  model: 'プリウス',
  year: 2022
};

const carDetails = Object.values(car);
console.log(carDetails); // ['トヨタ', 'プリウス', 2022]

この例では、carオブジェクトの値が配列として取得され、carDetailsに格納されています。

○Object.entries()メソッドを使用した変換

Object.entries()メソッドは、オブジェクトのキーと値のペアを配列として取得します。

このメソッドは、オブジェクトの全情報を維持したまま配列形式で扱いたい場合に有効です。

ここでは、Object.entries()メソッドの使用例を紹介します。

const student = {
  name: '鈴木一郎',
  grade: 3,
  subject: '数学'
};

const studentInfo = Object.entries(student);
console.log(studentInfo); 
// [['name', '鈴木一郎'], ['grade', 3], ['subject', '数学']]

この例では、studentオブジェクトのキーと値のペアが配列として取得され、studentInfoに格納されています。

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

配列からオブジェクトへの変換も、プログラミングにおいて頻繁に必要となる操作です。

ここでは、2つの主要な変換方法を紹介します。

この手法を習得することで、データの構造を柔軟に変更できるようになります。

○配列のreduce()メソッドを使用した変換

reduce()メソッドは、配列の要素を累積的に処理し、単一の結果を生成するための強力な機能です。

このメソッドを使用することで、配列の要素をオブジェクトのキーと値のペアに変換できます。

ここでは、reduce()メソッドを使用した変換例を紹介します。

const dataArray = ['name', '田中次郎', 'age', 25, 'city', '東京'];

const dataObject = dataArray.reduce((accumulator, currentValue, index) => {
  if (index % 2 === 0) {
    accumulator[currentValue] = dataArray[index + 1];
  }
  return accumulator;
}, {});

console.log(dataObject); 
// {name: '田中次郎', age: 25, city: '東京'}

この例では、キーと値が交互に格納されたdataArrayから、reduce()メソッドを使用してオブジェクトdataObjectを生成しています。

○forループとオブジェクトリテラルを使用した変換

forループとオブジェクトリテラルを組み合わせることで、配列からオブジェクトへの変換を行うこともできます。

この方法は、特に配列の各要素がキーと値のペアである場合に効果的です。

const employeeData = [['id', 1001], ['name', '高橋三郎'], ['department', '営業部']];

const employee = {};

for (const [key, value] of employeeData) {
  employee[key] = value;
}

console.log(employee); 
// {id: 1001, name: '高橋三郎', department: '営業部'}

この例では、キーと値のペアが格納されたemployeeData配列から、for...ofループを使用してオブジェクトemployeeを生成しています。

●サンプルコードと解説

ここでは、先ほど紹介した変換方法について、より具体的なサンプルコードと詳細な解説を提供します。

それぞれの方法の特徴と使用場面を理解することで、実際のプログラミングにおいて適切な手法を選択できるようになります。

○Object.keys()を使用したオブジェクトから配列への変換

Object.keys()メソッドは、オブジェクトのキーを配列として取得する際に使用します。

このメソッドは、オブジェクトの構造を分析したり、キーに基づいた処理を行う場合に特に有用です。

const product = {
  id: 'P001',
  name: '高性能ノートPC',
  price: 150000,
  inStock: true
};

const productProperties = Object.keys(product);
console.log(productProperties); 
// ['id', 'name', 'price', 'inStock']

// キーを使用した処理の例
productProperties.forEach(key => {
  console.log(`${key}: ${product[key]}`);
});
// 出力:
// id: P001
// name: 高性能ノートPC
// price: 150000
// inStock: true

この例では、productオブジェクトのキーを取得し、それらを使用して各プロパティの値を出力しています。

Object.keys()メソッドにより、オブジェクトのプロパティを動的に処理することが可能になります。

○Object.values()を使用したオブジェクトから配列への変換

Object.values()メソッドは、オブジェクトの値のみを配列として取得する際に使用します。

このメソッドは、オブジェクトの値に対して計算や集計を行う場合に特に役立ちます。

const scores = {
  math: 85,
  english: 92,
  science: 78,
  history: 89
};

const scoreValues = Object.values(scores);
console.log(scoreValues); 
// [85, 92, 78, 89]

// 値を使用した計算の例
const averageScore = scoreValues.reduce((sum, score) => sum + score, 0) / scoreValues.length;
console.log(`平均点: ${averageScore.toFixed(2)}`); 
// 平均点: 86.00

この例では、scoresオブジェクトの値を取得し、それらを使用して平均点を計算しています。

Object.values()メソッドにより、オブジェクトの値に簡単にアクセスし、処理することができます。

○Object.entries()を使用したオブジェクトから配列への変換

Object.entries()メソッドは、オブジェクトのキーと値のペアを配列として取得します。

このメソッドは、オブジェクトの全情報を保持したまま配列形式で操作したい場合に適しています。

const user = {
  id: 'U1234',
  username: 'tech_lover',
  email: 'tech_lover@example.com',
  lastLogin: '2024-08-06'
};

const userEntries = Object.entries(user);
console.log(userEntries);
// [
//   ['id', 'U1234'],
//   ['username', 'tech_lover'],
//   ['email', 'tech_lover@example.com'],
//   ['lastLogin', '2024-08-06']
// ]

// エントリーを使用した処理の例
userEntries.forEach(([key, value]) => {
  if (key === 'email' || key === 'lastLogin') {
    console.log(`${key}: ${value}`);
  }
});
// 出力:
// email: tech_lover@example.com
// lastLogin: 2024-08-06

この例では、userオブジェクトのキーと値のペアを取得し、特定のプロパティのみを表示しています。

Object.entries()メソッドにより、オブジェクトの構造を保持したまま柔軟な処理が可能になります。

○配列のreduce()メソッドを使用した配列からオブジェクトへの変換

reduce()メソッドは、配列の要素を累積的に処理し、単一の結果(この場合はオブジェクト)を生成します。

このメソッドは、配列の要素をオブジェクトのキーと値のペアに変換する際に非常に効果的です。

const userData = ['name', '山本五郎', 'age', 35, 'skills', ['JavaScript', 'Python', 'SQL']];

const userObject = userData.reduce((acc, cur, index) => {
  if (index % 2 === 0) {
    if (Array.isArray(userData[index + 1])) {
      acc[cur] = userData[index + 1];
    } else {
      acc[cur] = userData[index + 1];
    }
  }
  return acc;
}, {});

console.log(userObject);
// {
//   name: '山本五郎',
//   age: 35,
//   skills: ['JavaScript', 'Python', 'SQL']
// }

この例では、userData配列から複雑な構造を持つオブジェクトを生成しています。

reduce()メソッドを使用することで、配列内の配列要素も適切に処理されています。

○forループとオブジェクトリテラルを使用した配列からオブジェクトへの変換

forループとオブジェクトリテラルを組み合わせる方法は、配列の各要素がキーと値のペアである場合に特に効果的です。

この手法は、コードの可読性が高く、初心者の方々にも理解しやすい利点があります。

ここでは、forループを使用したより詳細な変換例を紹介します。

const companyData = [
  ['name', 'テックイノベーション株式会社'],
  ['founded', 2010],
  ['employees', 250],
  ['locations', ['東京', '大阪', '福岡']],
  ['services', {
    consulting: '技術コンサルティング',
    development: 'ソフトウェア開発',
    training: '技術者育成プログラム'
  }]
];

const company = {};

for (const [key, value] of companyData) {
  company[key] = value;
}

console.log(company);
// 出力:
// {
//   name: 'テックイノベーション株式会社',
//   founded: 2010,
//   employees: 250,
//   locations: ['東京', '大阪', '福岡'],
//   services: {
//     consulting: '技術コンサルティング',
//     development: 'ソフトウェア開発',
//     training: '技術者育成プログラム'
//   }
// }

// オブジェクトの特定のプロパティにアクセスする例
console.log(`会社名: ${company.name}`);
console.log(`設立年: ${company.founded}年`);
console.log(`従業員数: ${company.employees}人`);
console.log(`拠点: ${company.locations.join(', ')}`);
console.log('提供サービス:');
for (const [service, description] of Object.entries(company.services)) {
  console.log(`- ${service}: ${description}`);
}

この例では、companyData配列から複雑な構造を持つオブジェクトを生成しています。

配列には、文字列、数値、配列、さらにはネストされたオブジェクトなど、様々なデータ型が含まれています。

for...ofループを使用することで、これらの多様なデータ構造を適切に処理し、companyオブジェクトに変換しています。

変換後のオブジェクトは、会社の詳細情報を簡単に取得したり操作したりするのに役立ちます。

例えば、会社名、設立年、従業員数などの基本情報に直接アクセスできます。

また、拠点のリストや提供サービスの詳細情報など、より複雑なデータ構造も簡単に扱えます。

この手法の利点は、コードが直感的で理解しやすいことです。

各反復で何が起こっているかが明確で、デバッグや修正が容易です。

また、配列の要素が予測可能な構造を持っている場合、この方法は特に効果的です。

ただし、大量のデータや非常に複雑な構造を持つ配列を処理する場合は、パフォーマンスの観点からreduce()メソッドの使用を検討する価値があるかもしれません。

プロジェクトの要件や扱うデータの特性に応じて、適切な方法を選択することが重要です。

●変換時の注意点

オブジェクトと配列の変換を行う際には、いくつかの重要な点に注意する必要があります。

この注意点を理解し、適切に対処することで、より信頼性の高いコードを作成できます。

□キーの型の違い

オブジェクトのキーは文字列ですが、配列のインデックスは数値です。

配列からオブジェクトへ変換する際、インデックスをキーとして使用すると、自動的に文字列に変換されます。

これにより、予期せぬ動作が発生する可能性があります。

const arr = ['apple', 'banana', 'orange'];
const obj = {};

arr.forEach((item, index) => {
  obj[index] = item;
});

console.log(obj);
// 出力: { '0': 'apple', '1': 'banana', '2': 'orange' }

この例では、数値のインデックスが文字列のキーに変換されています。

□キーの一意性

オブジェクトのキーは一意である必要がありますが、配列には同じ値が複数存在することがあります。

配列からオブジェクトへ変換する際、同じキーが複数回出現すると、最後に登場したキーの値が優先されます。

const arr = ['key1', 'value1', 'key2', 'value2', 'key1', 'new_value1'];
const obj = {};

for (let i = 0; i < arr.length; i += 2) {
  obj[arr[i]] = arr[i + 1];
}

console.log(obj);
// 出力: { key1: 'new_value1', key2: 'value2' }

この例では、key1が2回出現していますが、最後の値(new_value1)が保持されています。

□順序の保持

オブジェクトは基本的に順序を保持しません(ES2015以降のJavaScriptでは順序が保持される場合もありますが、これに依存するべきではありません)。

そのため、変換後の配列やオブジェクトの順序が元のデータと異なる場合があります。

const obj = {c: 3, a: 1, b: 2};
const arr = Object.entries(obj);

console.log(arr);
// 出力は環境によって異なる可能性があります
// 例: [['c', 3], ['a', 1], ['b', 2]]

この例では、元のオブジェクトのキーの順序が保持されていない可能性があります。

□データ型の変換

オブジェクトと配列の間で変換を行う際、一部のデータ型が予期せず変換される可能性があります。

特に、数値や真偽値がオブジェクトのキーとして使用される場合、文字列に変換されることに注意が必要です。

const arr = [[1, 'one'], [true, 'yes'], [null, 'nothing']];
const obj = Object.fromEntries(arr);

console.log(obj);
// 出力: { '1': 'one', 'true': 'yes', 'null': 'nothing' }

この例では、数値の1、真偽値のtruenull値がすべて文字列のキーに変換されています。

□深いネストの処理

オブジェクトや配列が深くネストされている場合、単純な変換方法では適切に処理できない場合があります。

このような場合は、再帰的なアプローチや専用のライブラリの使用を検討する必要があります。

const nestedObj = {
  a: 1,
  b: {
    c: 2,
    d: [3, 4, 5]
  }
};

// 深いネストを処理する関数
function flattenObject(obj, prefix = '') {
  return Object.keys(obj).reduce((acc, k) => {
    const pre = prefix.length ? prefix + '.' : '';
    if (typeof obj[k] === 'object' && obj[k] !== null && !Array.isArray(obj[k])) {
      Object.assign(acc, flattenObject(obj[k], pre + k));
    } else {
      acc[pre + k] = obj[k];
    }
    return acc;
  }, {});
}

console.log(flattenObject(nestedObj));
// 出力: { a: 1, 'b.c': 2, 'b.d': [3, 4, 5] }

この例では、ネストされたオブジェクトを平坦化する関数を使用しています。

深いネストを持つ構造を処理する際は、このような専用の関数やライブラリを使用することが推奨されます。

まとめ

本記事では、JavaScriptにおけるオブジェクトと配列の相互変換について、初心者の方々にも理解しやすいよう、基本概念から実践的な変換手法まで詳しく解説しました。

この記事を足がかりとして、さらに高度な技術や概念にも挑戦していってください。

皆様のプログラミング学習がより実り多きものとなることを願っています。