SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

JavaScriptの「今」はこうなっている!現場のコードを変える注目機能を総ざらい

ECMAScriptのSetは単なる箱にあらず。使いどころを実践パターンとともに紹介

JavaScriptの「今」はこうなっている!現場のコードを変える注目機能を総ざらい 第4回

Setに加わった「集合論的」なメソッド(1)

 ES2025でNew Set methodsが標準化されてからは、Setの位置付けが変化しました。ただの「重複のないコレクション」が「集合論的」なメソッドを備えたデータ構造へと変化したのです。New Set methodsによって追加されたメソッドは以下の通りです(すべてSet.prototype配下)。

表:New Set methodsによって追加されたメソッド
メソッド 概要
intersection(other) otherとの交差を得る
union(other) otherとの和集合を得る
difference(other) otherとの差を得る
symmetricDifference(other) otherとの対称差を得る
isSubsetOf(other) otherの部分集合であればtrueを返す
isSupersetOf(other) otherが部分集合であればtrueを返す
isDisjointFrom(other) otherと互いに素であればtrueを返す

 このうちintersection、union、difference、symmetricDifferenceの4つのメソッドは、2の集合の間で演算を行い、結果の集合を返します。これらのメソッドが実行する演算と結果は、以下の図の通りです。

図:intersection、union、difference、symmetricDifferenceの演算
図:intersection、union、difference、symmetricDifferenceの演算

 isSubsetOf、isSupersetOf、isDisjointFromの3つのメソッドは、2つの集合の関係を判定して結果を論理値で返します。これらのメソッドが行う判定と結果は、以下の図の通りです。

図:isSubsetOf、isSupersetOf、isDisjointFromによる判定
図:isSubsetOf、isSupersetOf、isDisjointFromによる判定

 なお部分集合には、完全一致を除く真部分集合という概念もありますが、ECMAScriptでは同一のものとして扱われます。

 以降、それぞれのメソッドの動きをサンプルを通じて見ていきましょう。

2つの集合の交差を得る──intersectionメソッド

 intersectionメソッドは、2つの集合の交差(A ∩ B)を計算して新たなSetオブジェクトを返します。交差とは、双方の集合に共通する要素を言います。論理演算で言えば論理積(AND)に相当するものと考えれば分かりやすいですね。

 たとえば、数学が好きな生徒のリスト、理科が好きな生徒のリストがあるとき、数学と理科の両方が好きな生徒の数を求める、といった場合に利用できます。

 以下のリストは、2つの集合の交差を求めるものですが、intersectionメソッドが使えないときの従来の方法、そしてintersectionメソッドによる方法の2つを示しています(出力例は同じなのでどちらか一方のみ掲載。以降も同様)。

リスト intersection.js
const mathematics = new Set(['鈴木', '山田', '田中', '佐藤', '高橋']);
const science = new Set(['佐藤', '高橋', '伊藤', '渡辺', '山本']);

const intersection = new Set([...mathematics]
  .filter(x => science.has(x)));	// scienceにもある人を抽出
console.log(`数学も理科も好きな生徒は ${intersection.size} 人です。`);
console.log(`数学も理科も好きな生徒は ${mathematics.intersection(science).size} 人です。`);	// 数学も理科も好きな生徒は 2 人です。

 このように同じ結果が得られますが、intersectionメソッドを使わないと、既述のようにいったん配列に展開した上でfilterメソッドによって共通要素を抽出し、再びSetオブジェクトに戻すなどやや煩雑な処理となります。

2つの集合の和集合を得る――unionメソッド

 unionメソッドは、2つの集合の和集合(A ∪ B)を計算して新たなSetオブジェクトを返します。和集合とは、文字通り双方の集合を合わせたものです。論理演算でいえば論理和(OR)に相当します。

 たとえば、数学が好きな生徒のリスト、理科が好きな生徒のリストがあるとき、数学と理科のいずれかが好きな生徒の数を求める、といったときに利用できます。

 以下のリストは、2つの集合の和集合を求めるものです。

リスト union.js
const mathematics = new Set(['鈴木', '山田', '田中', '佐藤', '高橋']);
const science = new Set(['佐藤', '高橋', '伊藤', '渡辺', '山本']);

const union = new Set([...mathematics, ...science]);
console.log(`数学と理科のいずれかが好きな生徒は ${union.size} 人です。`);
console.log(`数学と理科のいずれかが好きな生徒は ${mathematics.union(science).size} 人です。`);	// 数学と理科のいずれかが好きな生徒は 8 人です。

 unionメソッドを使わずに和集合を求める方法として、2つの集合を配列に展開し、その配列からSetオブジェクトを生成しています。このとき、重複する要素があれば除去されるので、重複する要素を持てないというSetオブジェクトのルールは守られます。

2つの集合の差を得る――differenceメソッド

 differenceメソッドは、2つの集合の差(A - B)を計算して新たなSetオブジェクトを返します。差は交差とは異なり、ある集合から見て別の集合にない要素を指します。たとえば、会員リストから退会者を除いたリストを作る、タスクリストから完了タスクを除いたリストを作る、といったときに利用できます。

 以下のリストは、2つの集合の差を求めるものです。

リスト difference.js
const members = new Set(['鈴木', '山田', '田中', '佐藤', '高橋']);
const retired = new Set(['山田', '高橋']);

const difference = new Set([...members]
    .filter(x => !retired.has(x)));	// retiredにいない人だけを抽出
console.log(`退会者以外のメンバーは ${[...difference].join(', ')} です。`);
console.log(`退会者以外のメンバーは ${[...members.difference(retired)].join(', ')} です。`);	// 退会者以外のメンバーは 鈴木, 田中, 佐藤 です。

 この例ではdifferenceメソッドの結果を配列に展開して、joinメソッドで文字列化しています。Setオブジェクトには文字列化のメソッドはないので、このように配列を経由する必要があるのは変わりません。

次のページ
Setに加わった「集合論的」なメソッド(2)

この記事は参考になりましたか?

JavaScriptの「今」はこうなっている!現場のコードを変える注目機能を総ざらい連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/29909 2026/10/14 09:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー