web-dev-qa-db-ja.com

JavaScriptにはセットデータ構造の実装がありますか?

JavaScriptのセットデータ構造の適切な実装を探しています。プレーンJavaScriptオブジェクトである要素をサポートできる必要があります。

これまでのところ Closure Libraryのstructs.Set しか見つかりませんでしたが、データが変更されるという事実は好きではありません。

33
Tim Molendijk

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
11
Tim Down

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

オブジェクト自体に格納する以外に、オブジェクトのハッシュコードを処理する方法はないと思います。厳密に言えば、単純な線形検索を使用して、ハッシュなしでセットクラスを作成することは可能ですが、これは効率的ではありません。

2
user187291

使用 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

AngularJsを使用しているユーザー向けの更新

セットはng-repeatでは機能しないことに注意してください。したがって、配列を使用し、一意のフィルターを適用するだけの方が良い

2
CommonSenseCode

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もあります。

1
Salvador Dali

私は Simple-JS-Set が好きです(おそらく私が書いたためです)。あらゆる種類のJavaScriptオブジェクトをサポートします。次のAPIがあります。

  • Set(hashFunction):(コンストラクタ)指定されたhashFunctionで新しいセットをインスタンス化します(デフォルトは_JSON.stringify_)
  • add(item):セットにアイテムを追加します
  • remove(item):セットからアイテムを削除します
  • contains(item):アイテムがセットに含まれているかどうかを返します
  • size():セット内の一意のアイテムの数を返します
  • each(function(item), thisObj)thisObjのコンテキストでセット内の各項目を使用して関数を実行します
1
Lukas