JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで2つのセットを結合する方法(和集合・ユニオンの実装)

2つのセットを追加する操作は「和集合(ユニオン)」と呼ばれます。これは、片方のセットに含まれるすべての要素を新しいセットに追加しながら、重複を排除していく処理です。すでに実装済みのメソッドを組み合わせれば、この操作は簡単に実現できます。

既存のセットを変更(ミューテート)せず、新しいセットを作成して返す設計とするため、この関数は静的メソッドとして実装します。まず最初に、引数として渡されたオブジェクトが本当にMySetクラスのインスタンスであるかを検証しましょう。

実装例

static union(s1, s2) {
  if (!(s1 instanceof MySet) || !(s2 instanceof MySet)) {
    console.log("渡されたオブジェクトはMySet型ではありません");
    return null;
  }
  let newSet = new MySet();
  s1.forEach(elem => newSet.add(elem));
  s2.forEach(elem => newSet.add(elem));
  return newSet;
}

ポイントは、instanceofによる型チェックを括弧で囲むことです。!s1 instanceof MySetのように書くと演算子の優先順位により意図しない動作になるため、!(s1 instanceof MySet)と記述するのが正しい書き方です。

それでは、実際に動作を確認してみましょう。

使用例

const testSet1 = new MySet();
testSet1.add(1);
testSet1.add(2);

const testSet2 = new MySet();
testSet2.add(2);
testSet2.add(5);

let testSet3 = MySet.union(testSet1, testSet2);
testSet3.display();

出力

上記のコードを実行すると、次のような結果が得られます。

{ '1': '1', '2': '2', '5': '5' }

両方のセットに含まれていた値 2 が重複なく1つだけ格納されていることが確認できます。

ネイティブのSetクラスを拡張する方法

なお、union関数はES6の標準APIには存在しません。しかし、以下のようにSetクラスに関数を追加することで、ネイティブのセットでも同じ操作が使えるようになります。

実装例

Set.union = function(s1, s2) {
  if (!(s1 instanceof Set) || !(s2 instanceof Set)) {
    console.log("渡されたオブジェクトはSet型ではありません");
    return null;
  }
  let newSet = new Set();
  s1.forEach(elem => newSet.add(elem));
  s2.forEach(elem => newSet.add(elem));
  return newSet;
}

使用例

let setA = new Set([1, 2, 3, 4]);
let setB = new Set([2, 3]);
console.log(Set.union(setA, setB));

出力

実行結果は以下のとおりです。

Set { 1, 2, 3, 4 }

補足:最新のJavaScriptでは標準メソッドが利用可能

ES2025以降の環境では、Set.prototype.union()をはじめとするセット操作用の標準メソッド(intersectiondifferenceなど)が公式に追加されています。モダンなランタイムやブラウザを対象とする場合は、独自実装ではなくこれらのビルトインメソッドを使うことで、より簡潔かつ安全に和集合を計算できます。

  1. JavaScriptのプロトタイプにメソッドを追加する方法

    JavaScriptのプロトタイプにメソッドを追加する方法JavaScriptでは、コンストラクタ関数のprototypeプロパティにメソッドを追加することで、そのコンストラクタから生成されたすべてのインスタンスが同じメソッドを共有できるようになります。各インスタンスに個別にメソッドを定義する必要がなくなるため、メモリの使用量を抑えられ、コードの保守性も向上します。以下は、JavaScriptのプロトタイプにメソッドを追加するコード例です。コード例<!DOCTYPE html> <html lang="ja"> <head> <me

  2. JavaScriptで2つの数値を加算する際に必要な繰り上がり(キャリー)の回数を求める方法

    問題 2つの数値を受け取るJavaScriptの関数を記述する必要があります。 この関数は、まるで紙の上で筆算を行うように、その2つの数値を加算する際に発生する繰り上がり(キャリー)の回数を数えて返すものとします。 例えば、次の図のように 179 と 284 を足し合わせる場合、繰り上がりは2回発生します。したがって、この2つの数値を渡したとき、関数は 2 を返す必要があります。 解き方のポイント この問題は、各桁を下の位から順番に見ていき、「その桁の2つの数字と、前の桁からの繰り上がりの合計が10以上になったかどうか」を判定することで解けます。 剰余演算子(%)を使えば、数値の一番下の