最近導入された ES6 Set オブジェクトは、演算子と同様に、等価性の比較に恒等アルゴリズムを利用します。次の例に示すように、このアプローチはオブジェクトの比較には適していません:
var set = new Set(); set.add({a:1}); set.add({a:1}); console.log([...set.values()]); // Array [ Object, Object ]
同一のプロパティを持つ 2 つのオブジェクトは、まったく同じオブジェクトではないため、セット内の別個の要素とみなされます。この制限により、オブジェクトの詳細な比較を容易にするために Set オブジェクトの等価性をカスタマイズする方法についての問題が生じます。
現在の制限と提案された解決策
現時点では、ES6 Set オブジェクト等価比較をカスタマイズするための組み込みメソッドがありません。これに対処するために、著者は Set を継承し、.has()、.add()、および .delete() メソッドをオーバーライドして詳細なオブジェクト比較を実行する派生オブジェクトを作成することを提案しています。ただし、このアプローチは、基礎となる Set オブジェクトの機能を利用しないため、非効率的です。
この記事では、JavaScript にレコードとタプルを導入することを目的とした開発中の提案について言及しています。これらの不変データ構造は詳細な値の比較を実装することが期待されており、これにより前述の問題が効果的に解決されます。ただし、この提案はまだ開発中であり、まだ完全には実装されていません。
その他の考慮事項
セット内でのオブジェクト比較の代替戦略には次のものがあります。
これらのアプローチは、次のことを提供します。回避策はありますが、Set オブジェクトの等価動作を直接カスタマイズしないでください。
以上がJavaScript Set オブジェクトの等価性をカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。