見出し画像

Java Scriptの基礎その18 JavaScriptのSetとMapの基本と応用


イントロダクション

JavaScriptには、データを効率的に管理するための便利なデータ構造がいくつかあります。その中でも、SetとMapはユニークな値の集合やキーと値のペアを効率的に扱うための強力なツールです。この記事では、SetとMapの基本的な使い方から応用例までを丁寧に解説し、実際のコードを通じて理解を深めていきます。

Setについて

Setの基本

Setは一意の値の集合を保持するデータ構造です。同じ値を複数回追加しても、Setは一度しか保持しません。


const italianMenu = new Set([
  "パスタ",
  "ピザ",
  "スパゲッティ",
  "カルボナーラ",
  "スパゲッティ",
  "ピザ",
]);

console.log(italianMenu);

このコードは、「パスタ」、「ピザ」、「スパゲッティ」、「カルボナーラ」の4つのユニークな要素を含むSetを作成します。重複する「スパゲッティ」と「ピザ」は1回しか保持されません。

出力:

Set(4) {"パスタ", "ピザ", "スパゲッティ", "カルボナーラ"}

新しいSetの作成

新しいSetを作成して、その内容を出力します。

console.log(new Set(["パエリア", "アヒージョ", "アヒージョ", "ハモンセラーノ"]));

出力:

Set(3) {"パエリア", "アヒージョ", "ハモンセラーノ"}

Setの操作

Setのサイズの取得、要素の存在確認、要素の追加・削除を行います。

console.log(italianMenu.size); // Setのサイズを取得
console.log(italianMenu.has("ピザ")); // 「ピザ」が含まれているか確認

italianMenu.add("ジェラート"); // 新しい要素を追加
console.log(italianMenu);

italianMenu.add("ジェラート"); // 重複する要素の追加
console.log(italianMenu);

italianMenu.delete("スパゲッティ"); // 特定の要素を削除
console.log(italianMenu);

出力:

4
true
Set(5) {"パスタ", "ピザ", "スパゲッティ", "カルボナーラ", "ジェラート"}
Set(5) {"パスタ", "ピザ", "スパゲッティ", "カルボナーラ", "ジェラート"}
Set(4) {"パスタ", "ピザ", "カルボナーラ", "ジェラート"}

インデックスによるアクセス

Setは配列のようにインデックスでアクセスすることはできません。

console.log(italianMenu[0]); // undefined

出力:

undefined

配列からSetへの変換

配列の重複を取り除きたい場合、Setを利用してユニークな要素の集合を作成できます。

const staffList = [
  "ウェイター",
  "シェフ",
  "ウェイター",
  "マネージャー",
  "マネージャー",
];

const staffUnique_1 = new Set(staffList);
console.log(staffUnique_1);

const staffUnique_2 = [...new Set(staffList)];
console.log(staffUnique_2);

出力:

Set(3) {"ウェイター", "シェフ", "マネージャー"}
["ウェイター", "シェフ", "マネージャー"]

文字列からSetへの変換

文字列もSetに変換することができます。

console.log(new Set("amuronamie").size);

出力:

6

Mapについて

Mapの基本

Mapはキーと値のペアを保持するデータ構造です。キーにはあらゆるデータ型を使用でき、各キーは一意である必要があります。

const sampleBarber = new Map();
sampleBarber.set("店名", "ヘアカットサロン太郎");
sampleBarber.set(1, "東京都上野");
sampleBarber.set(2, "東京都秋葉原");

console.log(sampleBarber);

出力:

Map(3) {"店名" => "ヘアカットサロン太郎", 1 => "東京都上野", 2 => "東京都秋葉原"}

Mapの操作

Mapでは、キーで値を取得したり、キーの存在を確認したり、エントリを削除したりすることができます。

console.log(sampleBarber.get("店名")); // キー "店名" の値を取得
console.log(sampleBarber.get(1)); // キー 1 の値を取得

sampleBarber.delete(2); // キー 2 のエントリを削除
console.log(sampleBarber);

出力:

ヘアカットサロン太郎
東京都上野
Map(2) {"店名" => "ヘアカットサロン太郎", 1 => "東京都上野"}

Mapのサイズとクリア

Mapのエントリ数を取得したり、すべてのエントリを削除したりできます。

console.log(sampleBarber.size); // Mapのサイズを取得
sampleBarber.clear(); // すべてのエントリを削除
console.log(sampleBarber);

出力:

2
Map(0) {}

Mapの詳細な操作

複数のキーと値を追加し、動的に値を取得します。

sampleBarber
  .set("サービス", ["ヘアカット", "髭剃り", "パーマ", "肩揉み"])
  .set("開店", 11)
  .set("閉店", 20)
  .set(true, "開店してます")
  .set(false, "閉店してます");

console.log(sampleBarber.get("店名"));
console.log(sampleBarber.get(true));
console.log(sampleBarber.get(1));

const currentTime = 8;
console.log(
  sampleBarber.get(
    currentTime > sampleBarber.get("開店") &&
      currentTime < sampleBarber.get("閉店")
  )
);

console.log(sampleBarber.has("カテゴリ"));
sampleBarber.delete(2);

const arraySample = [1, 2];
sampleBarber.set(arraySample, "テスト");
sampleBarber.set(document.querySelector("h1", "Heading"));
console.log(sampleBarber.size);
console.log(sampleBarber.get(arraySample));
sampleBarber.clear();

出力:

ヘアカットサロン太郎
開店してます
東京都上野
undefined
false
5
テスト
0

アンケートの例

Mapを使ったアンケートの例です。ユーザーの入力を受け取り、その結果を評価します。

const programmingSurvey = new Map([
  ["質問です", "この世で一番最強なプログラミング言語はどれですか?"],
  [1, "C++"],
  [2, "Java"],
  [3, "Java Script"],
  [4, "Python"],
  ["正解", 2],
  [true, "正解!🥳"],
  [false, "残念。違います。"],
]);

console.log(programmingSurvey);
console.log(programmingSurvey.get("質問です"));

for (const [key, value] of programmingSurvey) {
  if (typeof key === "number") console.log(`${key}:${value}`);
}

const displayAnswer = Number(prompt("どれでしょう?"));
console.log(
  programmingSurvey.get(programmingSurvey.get("正解") === displayAnswer)
);

出力:

Map(8) {"質問です" => "この世で一番最強なプログラミング言語はどれですか?", 1 => "C++", 2 => "Java", 3 => "Java Script", 4 => "Python", "正解" => 2, true => "正解!🥳", false => "残念。違います。"}
この世で一番最強なプログラミング言語はどれですか?
1:C++
2:Java
3:Java Script
4:Python

Mapから配列への変換

Mapのキーや値を配列に変換することもできます。

console.log([...programmingSurvey]);
console.log([...programmingSurvey.keys()]);
console.log([...programmingSurvey.values()]);

出力:

[["質問です", "この世で一番最強なプログラミング言語はどれですか?"], [1, "C++"], [2, "Java"], [3, "Java Script"], [4, "Python"], ["正解", 2], [true, "正解!🥳"], [false, "残念。違います。"]]
["質問です", 1, 2, 3, 4, "正解", true, false]
["この世で一番最強なプログラミング言語はどれですか?", "C++", "Java", "Java Script", "Python", 2, "正解!🥳", "残念。違います。"]

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

オブジェクトのエントリをMapに変換します。

const edmArtists = [
  {
    name: "Martin Garrix",
    origin: "Netherlands",
  },
  {
    name: "Avicii",
    origin: "Sweden",
  },
  {
    name: "Zedd",
    origin: "Russia/Germany",
  },
  {
    name: "Marshmello",
    origin: "USA",
  },
];

console.log(Object.entries(edmArtists));
const edmMap = new Map(Object.entries(edmArtists));
console.log(edmMap);

出力:

[[0, {name: "Martin Garrix", origin: "Netherlands"}], [1, {name: "Avicii", origin: "Sweden"}], [2, {name: "Zedd", origin: "Russia/Germany"}], [3, {name: "Marshmello", origin: "USA"}]]
Map(4) {0 => {name: "Martin Garrix", origin: "Netherlands"}, 1 => {name: "Avicii", origin: "Sweden"}, 2 => {name: "Zedd", origin: "Russia/Germany"}, 3 => {name: "Marshmello", origin: "USA"}}

まとめ

JavaScriptのSetとMapは、それぞれ異なる特性と用途を持つ強力なデータ構造です。Setはユニークな値のコレクションを提供し、重複を排除するのに役立ちます。Mapはキーと値のペアを柔軟に管理し、キーにはあらゆるデータ型を使用できます。これらを理解し活用することで、より効率的で明確なコードを書くことができます。日常的なプログラミングにこれらのデータ構造を活用してみましょう。

Githubでも公開してるよ!

先ほどのコードはGithubで公開しているよ。
ここ見てね!

この記事が気に入ったらサポートをしてみませんか?