1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptセットでオブジェクトの等価性をカスタマイズする方法

2022-05-02 06:03:27

質問

新しいES 6(ハーモニー)は、新しいものを導入します。 セット オブジェクトを作成します。Setが使用するIdentityアルゴリズムは === 演算子を使うので、オブジェクトの比較にはあまり適しません。

var set = new Set();
set.add({a:1});
set.add({a:1});
console.log([...set.values()]); // Array [ Object, Object ]

オブジェクトを深く比較するために、Set オブジェクトの等式をカスタマイズする方法は?Java のようなものはありますか? equals(Object) ?

解決方法は?

ES6 Set オブジェクトは、compare メソッドやcompare のカスタム拡張機能を持ちません。

.has() , .add().delete() メソッドは、実際のオブジェクトやプリミティブの値が同じである場合にのみ動作し、そのロジックに接続したり置き換えたりする手段を持っていません。

のオブジェクトから独自のオブジェクトを派生させることができると思われます。 Set を置き換えると .has() , .add().delete() メソッドに、アイテムがすでにセット内にあるかどうかを見つけるために最初に深いオブジェクト比較を行うようなものを追加することができます。 Set オブジェクトは全く役に立ちません。 おそらく、既存のすべてのオブジェクトを総当り的に反復して、独自のカスタム比較を使って一致するものを見つけてから、オリジナルの .add() .

以下はその情報です。 この記事と考察 ES6の特徴について

<ブロッククオート

5.2 なぜ、マップやセットがキーと値を比較する方法を設定できないのですか?

質問です。どのようなマップの キーとセット要素が等しいとみなされます。なぜないのでしょうか?

回答 その機能は困難であるため、延期されました。 を適切かつ効率的に実装することができます。一つの選択肢は、コールバックを コレクションに等式を指定します。

もう1つの方法は、Javaで利用可能な、メソッドで等価性を指定することです。 を実装しています(Javaではequals())。しかし、この方法は は、ミュータブルオブジェクトの場合、問題があります。一般に、オブジェクトが変更されると、その コレクション内の "場所 "も変更しなければならない。しかし、それは Javaではそうなっています。JavaScriptでは、おそらく以下のような安全策を取るでしょう。 値による比較は、特別な不変オブジェクトに対してのみ有効です。 (いわゆるバリューオブジェクト)。値による比較とは、2つの値 は、その内容が等しい場合に等しいとみなされます。原始的な値は JavaScriptでは値で比較します。