🙌
【図解】リスト(配列)と辞書(オブジェクト)の違いを解説
プログラミングでデータを扱う際、最も基本的なデータ構造が「リスト(配列)」と「辞書(オブジェクト)」です。この記事では、これらの違いと使い方について、図解を交えてわかりやすく解説します。
リスト(配列)とは?
リストは、複数のデータを順序付けて格納するデータ構造です。本棚に本を順番に並べるようなイメージです。
リストの特徴
-
順序がある
- 各要素に位置(インデックス)がある
- 0から始まる番号で要素にアクセスできる
-
同じ値を複数格納できる
- 重複した値を持つことができる
-
要素の追加・削除が可能
- リストの末尾や途中に要素を追加できる
- 既存の要素を削除できる
JavaScriptでのリストの例
// リスト(配列)の作成
let fruits = ["りんご", "バナナ", "オレンジ"];
// インデックスを使って要素にアクセス
console.log(fruits[0]); // "りんご"
console.log(fruits[1]); // "バナナ"
console.log(fruits[2]); // "オレンジ"
// 要素の追加
fruits.push("ぶどう");
console.log(fruits); // ["りんご", "バナナ", "オレンジ", "ぶどう"]
// 要素の削除
fruits.pop(); // 末尾の要素を削除
console.log(fruits); // ["りんご", "バナナ", "オレンジ"]
リストの一般的な操作
let numbers = [1, 2, 3, 4, 5];
// 要素の追加(末尾)
numbers.push(6); // [1, 2, 3, 4, 5, 6]
// 要素の追加(先頭)
numbers.unshift(0); // [0, 1, 2, 3, 4, 5, 6]
// 要素の削除(末尾)
numbers.pop(); // [0, 1, 2, 3, 4, 5]
// 要素の削除(先頭)
numbers.shift(); // [1, 2, 3, 4, 5]
// 特定の位置に要素を追加/削除
numbers.splice(2, 0, 2.5); // [1, 2, 2.5, 3, 4, 5]
// 要素の検索
let index = numbers.indexOf(3); // 3の位置(3)を取得
辞書(オブジェクト)とは?
辞書は、キーと値のペアでデータを格納するデータ構造です。実際の辞書のように、単語(キー)とその意味(値)が対応しているイメージです。
辞書の特徴
-
キーと値のペア
- 各データにキー(名前)が付いている
- キーを使って値にアクセスする
-
キーは一意
- 同じキーを複数持つことはできない
- 値は重複可能
-
順序は保証されない
- データの格納順序は重要ではない
JavaScriptでの辞書の例
// 辞書(オブジェクト)の作成
let person = {
name: "山田太郎",
age: 25,
city: "東京"
};
// キーを使って値にアクセス
console.log(person.name); // "山田太郎"
console.log(person["age"]); // 25
// 値の更新
person.age = 26;
person["city"] = "大阪";
// 新しいキーと値の追加
person.email = "yamada@example.com";
console.log(person);
// {
// name: "山田太郎",
// age: 26,
// city: "大阪",
// email: "yamada@example.com"
// }
辞書の一般的な操作
let user = {
id: 1,
name: "鈴木一郎",
isAdmin: false
};
// プロパティの存在確認
console.log("name" in user); // true
console.log(user.hasOwnProperty("age")); // false
// キーの一覧を取得
console.log(Object.keys(user)); // ["id", "name", "isAdmin"]
// 値の一覧を取得
console.log(Object.values(user)); // [1, "鈴木一郎", false]
// キーと値のペアを取得
console.log(Object.entries(user));
// [["id", 1], ["name", "鈴木一郎"], ["isAdmin", false]]
// プロパティの削除
delete user.isAdmin;
リストと辞書の使い分け
リストを使うべき場合
-
順序が重要な場合
// 順位表 let rankings = ["金メダル", "銀メダル", "銅メダル"]; // 手順 let steps = ["材料を用意", "混ぜる", "焼く", "盛り付け"];
-
同じ型のデータをまとめて処理する場合
// 数値の配列を処理 let scores = [85, 90, 75, 88]; let total = scores.reduce((sum, score) => sum + score, 0); let average = total / scores.length;
-
データを順番に処理する場合
// 配列の各要素を処理 let names = ["田中", "鈴木", "佐藤"]; names.forEach((name, index) => { console.log(`${index + 1}番目: ${name}`); });
辞書を使うべき場合
-
データに名前(キー)を付けたい場合
// ユーザー情報 let user = { id: "user123", name: "山本花子", email: "yamamoto@example.com", age: 28 };
-
複数の関連データをまとめたい場合
// 商品情報 let product = { name: "スマートフォン", price: 50000, stock: 100, manufacturer: "TechCo", specifications: { color: "ブラック", weight: "180g", size: "6.1インチ" } };
-
キーと値の対応関係が重要な場合
// 都道府県コード let prefectureCodes = { "東京": "13", "大阪": "27", "京都": "26", "神奈川": "14" };
実践的な例
1. 学生管理システム
// リストとオブジェクトの組み合わせ
let students = [
{
id: "001",
name: "山田太郎",
scores: {
math: 85,
english: 90,
science: 78
}
},
{
id: "002",
name: "鈴木花子",
scores: {
math: 92,
english: 85,
science: 90
}
}
];
// 成績の平均値を計算する関数
function calculateAverage(student) {
const scores = Object.values(student.scores);
const total = scores.reduce((sum, score) => sum + score, 0);
return total / scores.length;
}
// 各学生の平均点を表示
students.forEach(student => {
const average = calculateAverage(student);
console.log(`${student.name}の平均点: ${average}`);
});
2. 買い物カートシステム
// 商品マスタ(辞書)
const products = {
"A001": { name: "コーヒー", price: 300 },
"A002": { name: "紅茶", price: 250 },
"A003": { name: "緑茶", price: 200 }
};
// カートの内容(リスト)
let cart = [
{ productId: "A001", quantity: 2 },
{ productId: "A003", quantity: 1 }
];
// 合計金額を計算する関数
function calculateTotal(cart) {
return cart.reduce((total, item) => {
const product = products[item.productId];
return total + (product.price * item.quantity);
}, 0);
}
// カートの内容を表示する関数
function displayCart(cart) {
console.log("=== カートの内容 ===");
cart.forEach(item => {
const product = products[item.productId];
console.log(`${product.name}: ${item.quantity}個 (${product.price * item.quantity}円)`);
});
console.log(`合計: ${calculateTotal(cart)}円`);
}
displayCart(cart);
3. タスク管理システム
// タスクの状態を管理する辞書
const taskStatus = {
"TODO": "未着手",
"IN_PROGRESS": "進行中",
"DONE": "完了"
};
// タスクのリスト
let tasks = [
{
id: 1,
title: "企画書作成",
status: "IN_PROGRESS",
assignee: "田中",
dueDate: "2024-08-01"
},
{
id: 2,
title: "ミーティング",
status: "TODO",
assignee: "鈴木",
dueDate: "2024-08-02"
},
{
id: 3,
title: "報告書提出",
status: "DONE",
assignee: "佐藤",
dueDate: "2024-07-31"
}
];
// タスクの状態でフィルタリングする関数
function filterTasksByStatus(tasks, status) {
return tasks.filter(task => task.status === status);
}
// 担当者ごとのタスク数を集計する関数
function countTasksByAssignee(tasks) {
return tasks.reduce((counts, task) => {
counts[task.assignee] = (counts[task.assignee] || 0) + 1;
return counts;
}, {});
}
// 結果を表示
console.log("進行中のタスク:", filterTasksByStatus(tasks, "IN_PROGRESS"));
console.log("担当者別タスク数:", countTasksByAssignee(tasks));
まとめ
リスト(配列)と辞書(オブジェクト)の主な違いは:
-
データの格納方法
- リスト:順序付けられた要素の集まり
- 辞書:キーと値のペアの集まり
-
アクセス方法
- リスト:インデックス(数値)でアクセス
- 辞書:キー(文字列など)でアクセス
-
使用シーン
- リスト:順序が重要な場合、同じ型のデータをまとめる場合
- 辞書:データに名前を付けたい場合、関連データをまとめたい場合
適切なデータ構造を選択することで、より効率的で読みやすいコードを書くことができます。
次のステップ
データ構造の基本を理解したら、以下の記事も参考にしてください:
Discussion
これは 配列もオブジェクトも同じでは?