1708359997
2024-02-19 15:55:24
の JavaScript Set この言語は ES2015 仕様で導入されましたが、常に不完全であるように見えました。 それが変わろうとしている。
セットは、各値が 1 回だけ出現する値のコレクションです。 ES2015 バージョンでは、 Set、利用可能な機能は、メンバーシップの作成、追加、削除、およびチェックを中心に展開されていました。 Set。 複数のセットを操作または比較したい場合は、独自の関数を作成する必要がありました。 ありがたいことに、 TC39ECMAScript 仕様に取り組むために設立された委員会であり、ブラウザもこれに取り組んでいます。 現在、次のような関数が表示されています。 union、 intersection そして 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
から要素を削除できます。 Set と delete。
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 インスタンス: union、 intersection、 difference、 symmetricDifference、 isSubsetOf、 isSupersetOf、 そして 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 #セットに追加されます