日本語版
最新ニュース
科学&テクノロジー

結合、交差、差分などが JavaScript セットに追加されます

の JavaScript Set この言語は ES2015 仕様で導入されましたが、常に不完全であるように見えました。 それが変わろうとしている。 セットは、各値が 1 回だけ出現する値のコレクションです。 ES2015 バージョンでは、 Set、利用可能な機能は、メンバーシップの作成、追加、削除、およびチェックを中心に展開されていました。 Set。 複数のセットを操作または比較したい場合は、独自の関数を作成する必要がありました。 ありがたいことに、 TC39ECMAScript 仕様に取り組むために設立された委員会であり、ブラウザもこれに取り組んでいます。 現在、次のような関数が表示されています。 union、 intersection そして difference JavaScript の実装で。 新しい機能について説明する前に、JavaScript セットで何ができるのかをまとめてから、本題に移ります。 新しいセット関数 そしてその それらをサポートする JavaScript エンジン 下に。 ES2015 JavaScript セットは何をしますか? JavaScript の…

結合、交差、差分などが JavaScript セットに追加されます

1708359997
2024-02-19 15:55:24

JavaScript Set この言語は ES2015 仕様で導入されましたが、常に不完全であるように見えました。 それが変わろうとしている。

セットは、各値が 1 回だけ出現する値のコレクションです。 ES2015 バージョンでは、 Set、利用可能な機能は、メンバーシップの作成、追加、削除、およびチェックを中心に展開されていました。 Set。 複数のセットを操作または比較したい場合は、独自の関数を作成する必要がありました。 ありがたいことに、 TC39ECMAScript 仕様に取り組むために設立された委員会であり、ブラウザもこれに取り組んでいます。 現在、次のような関数が表示されています。 unionintersection そして difference JavaScript の実装で。

新しい機能について説明する前に、JavaScript セットで何ができるのかをまとめてから、本題に移ります。 新しいセット関数 そしてその それらをサポートする JavaScript エンジン 下に。

ES2015 JavaScript セットは何をしますか?

JavaScript の ES2015 バージョンを見てみましょう Set できる。 いくつかの例を使用するのが最も簡単です。

あなたはできる を構築する Set 引数なしの場合、空の値が得られます Set。 または、配列のような反復可能オブジェクトを提供して、 Set

const languages = new Set(["JavaScript", "TypeScript", "HTML", "JavaScript"]);

Setには一意の値のみを含めることができるため、 Set 上記のメンバーは3名です。 これは、 size 財産

languages.size;

// => 3

さらに要素を追加することもできます Set とともに add 関数。 すでに存在する要素を追加する Set 何もしません。

languages.add("JavaScript");

languages.add("CSS");

languages.size;

// => 4

から要素を削除できます。 Setdelete

languages.delete("TypeScript");

languages.size;

// => 3

要素が次のメンバーであるかどうかを確認できます。 Set とともに has 関数。 の利点の 1 つは、 Set このチェックは一定時間で実行できるということです (○(1))、要素が Array 長さによって異なります Array (の上))。 使用する Setこのようなタスクの場合は、 意図的に効率的なコードを書くきれいな方法

languages.has("JavaScript");

// => true

languages.has("TypeScript");

// => false

あなたはできる をループします Setの要素を使用して forEach または for...of ループ。 要素は、 Set

languages.forEach(element => console.log(element));

// "JavaScript"

// "HTML"

// "CSS"

次からイテレータを取得することもできます。 Set を使用して keys そして values 機能 (実際には同等です)だけでなく、 entries 関数。

最後に、次のコマンドを使用して Set を空にすることができます。 clear 関数。

languages.clear();

languages.size;

// => 0

これは、ES2015 仕様バージョンの Set:

  • Set一意の値のコレクションを処理するメソッドを提供します
  • に要素を追加すると効率的です。 Set そして、それらが存在するかどうかをテストするために、 Set
  • 変換する Array またはその他の反復可能 Set 重複をフィルタリングして除外する簡単な方法です

この実装では、次の間の操作が失われます。 Setただし。 を作成するとよいでしょう。 Set 他の 2 つのアイテムがすべて含まれています Sets (2 つの和集合 Sets)、次の 2 つを調べてください。 Setには共通点があるか (交差)、あるセットに存在せず、別のセットに存在するものを見つけます (相違点)。 最近までは、独自の関数を提供する必要がありました。

新しい Set 関数とは何ですか?

Set メソッドの提案では、次のメソッドが追加されます。 Set インスタンス: unionintersectiondifferencesymmetricDifferenceisSubsetOfisSupersetOf、 そして isDisjointFrom

これらのメソッドの一部は SQL 結合に似ており、コードとともに結果を説明するために使用します。 各関数の動作の例をいくつか見てみましょう。

Chrome 122 以降または Safari 17 以降では、以下のコード例のいずれかを試すことができます。

Set.prototype.union(その他)

セットの和集合は、いずれかのセットに存在するすべての要素を含むセットです。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);

const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);

const allLanguages = frontEndLanguages.union(backEndLanguages);

// => Set {"JavaScript", "HTML", "CSS", "Python", "Java"}

この例では、最初の 2 つのセットのすべての言語が 3 番目のセットに含まれています。 要素を追加する他のメソッドと同様に、 Set、重複は削除されます。

これは SQL に相当します。 FULL OUTER JOIN 2つのテーブルの間。

Set.prototype.intersection(その他)

交差とは、両方のセット内に存在するすべての要素を含むセットです。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);

const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);

const frontAndBackEnd = frontEndLanguages.intersection(backEndLanguages);

// => Set {"JavaScript"} 

ここの両方のセットに存在する要素は「JavaScript」だけです。

交差点は次のようなものです INNER JOIN

Set.prototype.difference(その他)

作業しているセットと別のセットの違いは、最初のセットにはすべての要素が存在し、2 番目のセットには存在しないことです。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);

const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);

const onlyFrontEnd = frontEndLanguages.difference(backEndLanguages);

// => Set {"HTML", "CSS"} 

const onlyBackEnd = backEndLanguages.difference(frontEndLanguages);

// => Set {"Python", "Java"}

セット間の違いを見つけるには、どのセットに対して関数を呼び出すか、そしてどれが引数であるかが重要です。 上の例では、フロントエンド言語からバックエンド言語を削除すると、「JavaScript」が削除され、結果セットで「HTML」と「CSS」が返されます。 一方、バックエンド言語からフロントエンド言語を削除しても、「JavaScript」は削除され、「Python」と「Java」が返されます。

違いは、 LEFT JOIN

Set.prototype.metricDifference(other)

2 つのセット間の対称的な違いは、2 つのセットの一方に含まれるすべての要素を含むセットですが、両方には含まれないことです。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);

const backEndLanguages = new Set(["Python", "Java", "JavaScript"]);

const onlyFrontEnd = frontEndLanguages.symmetricDifference(backEndLanguages);

// => Set {"HTML", "CSS", "Python", "Java"} 

const onlyBackEnd = backEndLanguages.symmetricDifference(frontEndLanguages);

// => Set {"Python", "Java", "HTML", "CSS"}

この場合、結果のセット内の要素は同じですが、順序が異なることに注意してください。 セットの順序は、要素がセットに追加される順序によって決まり、関数が実行されるセットには最初に要素が追加されます。

対称差分は、両方のテーブルにある要素を除外する FULL OUTER JOIN に似ています。

Set.prototype.isSubsetOf(other)

最初のセットのすべての要素が 2 番目のセットに出現する場合、セットは別のセットのサブセットになります。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);

const declarativeLanguages = new Set(["HTML", "CSS"]);

declarativeLanguages.isSubsetOf(frontEndLanguages);

// => true

frontEndLanguages.isSubsetOf(declarativeLanguages);

// => false

セットはそれ自体のサブセットでもあります。

frontEndLanguages.isSubsetOf(frontEndLanguages);

// => true

Set.prototype.isSupersetOf(other)

2 番目のセットのすべての要素が最初のセットに出現する場合、そのセットは別のセットのスーパーセットになります。 部分集合であることとは逆の関係です。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);

const declarativeLanguages = new Set(["HTML", "CSS"]);

declarativeLanguages.isSupersetOf(frontEndLanguages);

// => false

frontEndLanguages.isSupersetOf(declarativeLanguages);

// => true

セットはそれ自体のスーパーセットでもあります。

frontEndLanguages.isSupersetOf(frontEndLanguages);

// => true

Set.prototype.isDisjointFrom(other)

最後に、共通の要素がない場合、セットは別のセットから素です。

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);

const interpretedLanguages = new Set(["JavaScript", "Ruby", "Python"]);

const compiledLanguages = new Set(["Java", "C++", "TypeScript"]);

interpretedLanguages.isDisjointFrom(compiledLanguages);

// => true

frontEndLanguages.isDisjointFrom(interpretedLanguages);

// => false

これらのセット内のインタープリタ言語とコンパイル言語は重複していないため、セットは互いに素になっています。 フロントエンド言語とインタプリタ言語は要素「JavaScript」と重複するため、互いに素なわけではありません。

サポート

これを書いている時点では、 提案 ステージ3に立っています TC39のプロセス Safari 17 (2023 年 9 月リリース) と Chrome 122 (2024 年 2 月) には、これらのメソッドの実装が出荷されています。 Edge は Chrome に密接に追従しており、Firefox Nightly は旗の下でサポートを行っています。これらのブラウザの両方もすぐにサポートをリリースすると予想されます。

バン Safariも使ってます JavaScriptコアエンジン したがって、これらの新しい機能はすでにサポートされています。 Chrome でのサポートとは、Chrome が V8 JavaScript エンジン そして採用されることになる Node.js すぐ。

これは、提案がプロセスのステージ 4 に進み、おそらく最終決定される前に ES2024 仕様に参加するのに間に合うことを意味します。

ポリフィル

古い JavaScript エンジンのサポートが必要ですが、これらの関数の仕様に準拠した実装にアップグレードするために使用できるポリフィルがあります。 それらは以下で入手可能です コアjs または、機能ごとの個別のパッケージとして エスシムズプロジェクト (たとえば、 set.prototype.union パッケージ ユニオン機能に使用できます)。

これらの関数のいずれかの実装を独自に作成した場合は、サポートがより広範になるにつれてポリフィルを段階的に廃止する前に、まずポリフィルにアップグレードすることをお勧めします。

セットが不完全だと感じなくなりました

JavaScript Set は長い間不完全でしたが、これら 7 つの新しい関数によって実装がうまく完成しました。 このような機能を言語に組み込むことは、依存関係や独自の実装に依存する必要が少なくなり、 集中 私たちが解決しようとしている問題について。

これはほんの 1 つです ステージ 3 提案の完全なパイプライン 今はTC39の前です。 リストをチェックして、次に JavaScript に何が追加されるかを確認してください。 注目してるよ 時間的 そして デコレーターどちらも、JavaScript の主要部分の記述方法を変える可能性があります。

#結合交差差分などが #JavaScript #セットに追加されます

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。