JavaScriptのセットデータ構造の適切な実装を探しています。プレーンJavaScriptオブジェクトである要素をサポートできる必要があります。
これまでのところ Closure Libraryのstructs.Set しか見つかりませんでしたが、データが変更されるという事実は好きではありません。
My jshashtable によって提供されるハッシュテーブルのキーの周りに単純なラッパーを構築できます。後で掘り出す場所をノックアウトしています。
[〜#〜]更新[〜#〜]
HashSetの実装を完了してテストし、GitHubのjshashtableプロジェクトにアップロードしました。 ダウンロード または ソースを表示 できます。
var s = new HashSet();
var o1 = {name: "One"}, o2 = {name: "Two"};
s.add(o1);
s.add(o2);
s.values(); // Array containing o1 and o2
ECMAScript 6にはそれがあります
仕様: http://www.ecma-international.org/ecma-262/6.0/#sec-set-constructor
使用法: https://github.com/lukehoban/es6features#map--set--weakmap--weakset
例:
var s = new Set()
s.add("hello").add("goodbye").add("hello")
s.size === 2
s.has("hello") === true
サポートなしのブラウザー用に実装するモジュール: https://github.com/medikoo/es6-set
オブジェクト自体に格納する以外に、オブジェクトのハッシュコードを処理する方法はないと思います。厳密に言えば、単純な線形検索を使用して、ハッシュなしでセットクラスを作成することは可能ですが、これは効率的ではありません。
使用 ECMAScript 2015(ES6)標準セットデータ構造 本当に使いやすい:
var mySet = new Set();
mySet.add(1);
mySet.add(5);
mySet.add("some text");
var o = {a: 1, b: 2};
mySet.add(o);
mySet.has(1); // true
mySet.has(3); // false, 3 has not been added to the set
mySet.has(5); // true
mySet.has(Math.sqrt(25)); // true
mySet.has("Some Text".toLowerCase()); // true
mySet.has(o); // true
mySet.size; // 4
mySet.delete(5); // removes 5 from the set
mySet.has(5); // false, 5 has been removed
mySet.size; // 3, we just removed one value
セットはng-repeat
では機能しないことに注意してください。したがって、配列を使用し、一意のフィルターを適用するだけの方が良い
JavascriptのES6バージョンでは、組み込み型 set ( ブラウザとの互換性を確認 )を使用しています。
_var numbers = new Set([1, 2, 4]); // Set {1, 2, 4}
_
要素を追加をセットに追加するには、.add()
で実行されるO(1)
を使用し、要素をセットに追加します(存在しない場合)またはすでにそこにある場合は何もしません。そこで任意のタイプの要素(配列、文字列、数値)を追加できます
_numbers.add(4); // Set {1, 2, 4}
numbers.add(6); // Set {1, 2, 4, 6}
_
セット内の要素数を確認するには、単純に_.size
_を使用できます。 O(1)
でも実行されます
_numbers.size; // 4
_
要素をセットから削除する.delete()
を使用します。値が存在する(および削除された)場合はtrueを返し、値が存在しない場合はfalseを返します。 O(1)
でも実行されます。
_numbers.delete(2); // true
numbers.delete(2); // false
_
要素が存在するかどうかを確認するセット内で.has()
を使用すると、要素がセット内にある場合はtrueが返され、そうでない場合はfalseが返されます。 O(1)
でも実行されます。
_numbers.has(3); // false
numbers.has(1); // true
_
必要なメソッドに加えて、追加のメソッドはほとんどありません。
numbers.clear();
は、セットからすべての要素を削除するだけですnumbers.forEach(callback);
挿入順序でセットの値を反復するnumbers.entries();
すべての値のイテレータを作成しますnumbers.keys();
は、numbers.values()
と同じセットのキーを返しますオブジェクトタイプの値のみを追加できるWeaksetもあります。
私は Simple-JS-Set が好きです(おそらく私が書いたためです)。あらゆる種類のJavaScriptオブジェクトをサポートします。次のAPIがあります。
Set(hashFunction)
:(コンストラクタ)指定されたhashFunction
で新しいセットをインスタンス化します(デフォルトは_JSON.stringify
_)add(item)
:セットにアイテムを追加しますremove(item)
:セットからアイテムを削除しますcontains(item)
:アイテムがセットに含まれているかどうかを返しますsize()
:セット内の一意のアイテムの数を返しますeach(function(item), thisObj)
:thisObj
のコンテキストでセット内の各項目を使用して関数を実行します