web-dev-qa-db-ja.com

C#HashSetと同等のJavaScriptは何ですか?

数千の整数キーのリストがあります。このリストで行う必要があるのは、指定された値がリストにあるかどうかだけです。

C#の場合、HashSetを使用して検索を高速化します。 JavaScriptと同等のものは何ですか?


最小サポートレベル:IE 9+、jQuery(current)

51
Jonathan Allen

内部では、JavaScriptオブジェクトはハッシュテーブルを使用して実装されます。だから、あなたのKey:Valueペアは(your integer):true

一定時間のルックアップ関数は、次のように実装できます。

var hash = {
  1:true,
  2:true,
  7:true
  //etc...
};

var checkValue = function(value){
  return hash[value] === true;
};


checkValue(7); // => true
checkValue(3); // => false
60
LexJacobs

実際、JavaScriptには Set object が用意されており、非常に簡単に使用できます。

var set = new Set();
set.add(1);
set.add(2);

set.has(1)    // true

残念ながら、IE9との互換性はありません。

47
João Barbosa

オブジェクトを使用します。セットにキーを追加するには、次のようにします。

object[key] = true;

キーがセットに含まれているかどうかをテストするには、次を実行します。

if (object.hasOwnProperty(key)) { ... }

セットからキーを削除するには、次のようにします。

delete object[key]
30
Barmar

通常のJavaScriptオブジェクトと「in」キーワードを使用して、そのオブジェクトに特定のキーがあるかどうかを確認できます。

var myObj = {
  name: true,
  age: true
}

'name' in myObj //returns true;
'height' in myObj // returns false;

または、オブジェクトにJavaScriptオブジェクトプロパティで使用されるキーが含まれていることがわかっている場合...

var myObj = {
  name: true,
  age: true
}

myObj.hasOwnProperty('name') //returns true;
myObj.hasOwnProperty('height') // returns false;
7
Tyler McGinnis

マップ、またはWeakMapを反復する必要がない場合

let m1=new Map();

m1.set('isClosed',false);
m1.set('isInitialized',false);

m1.set('isClosed',true);

m1.forEach(function(v,k)
{
    console.log(`${k}=${v}`);
});
1
Kursat Turkay

私は解決策を読み、いくつか試してみました。 _object[key]_メソッドを使用しようとした後、機能しないことがわかりました。 HTML要素を格納できるHashSetが必要でした。これらのオブジェクトを追加すると、keyが文字列に変換されたため、jQueryに基づいて独自のセットを作成しました。 addremovecontains、およびclearをサポートしています。

_var HashSet = function () {

    var set = [];

    this.add = function (obj) {
        if (!this.contains(obj)) {
            set.Push(obj);
        }
    };

    this.remove = function (obj) {
        set = jQuery.grep(set, function (value) {
            return value !== obj;
        });
    };

    this.clear = function () {
        set = [];
    };

    this.contains = function (obj) {
        return $.inArray(obj, set) > -1;
    };

    this.isEmpty = function () {
        return set.length === 0;
    };
};
_


セットに$('#myElement')のようなものを追加する場合、実際のHTML要素$('#myElement')[0]を追加する必要があります。ああ...そして、変更されたコントロールのリストを保持したい場合-要素の名前を使用してください(_:radio_コントロールに問題があります)。

注2
_object[key]_は整数の方が速いと思います。


数字または文字列のみを保存する場合、このセットは高速になります。

_var HashSet = function () {

    var set = {};

    this.add = function (key) {
        set[key] = true;
    };

    this.remove = function (key) {
        delete set[key];
    };

    this.clear = function () {
        set = {};
    };

    this.contains = function (key) {
        return set.hasOwnProperty(key);
    };

    this.isEmpty = function () {
        return jQuery.isEmptyObject(set);
    };
};
_
1
Kees C. Bakker