web-dev-qa-db-ja.com

Java JavaScriptで設定)のようなデータ構造はありますか?

IDの数を格納するために使用できるJavaScriptのデータ構造を使用したいと思います。 Javaセットのように、そのセットにキーがすでに存在するかどうかを確認できるはずです。

次のように同じ動作を実現したいと思います(このコードはJavaです)。

Set<String> st = new HashSet<String>();
//add elemets

if(st.contains("aks") ){
  //do something
}

上記のコードと同等のJavaScript/dojoが必要です。

15
aks

私はあなたが望むことをし、どんなオブジェクトもセットのメンバーになることを可能にするJavaScript HashSet実装を書きました: http://code.google.com/p/jshashtable

ただし、文字列を格納するだけでよい場合は、セットメンバーを通常のオブジェクトのプロパティ名として格納するだけで、より簡単に何かを行うことができます。例えば:

_function StringSet() {
    var setObj = {}, val = {};

    this.add = function(str) {
        setObj[str] = val;
    };

    this.contains = function(str) {
        return setObj[str] === val;
    };

    this.remove = function(str) {
        delete setObj[str];
    };

    this.values = function() {
        var values = [];
        for (var i in setObj) {
            if (setObj[i] === val) {
                values.Push(i);
            }
        }
        return values;
    };
}
_

実装に関する注意:valは、各セットに固有のStringSet実装によって内部的に使用されるオブジェクトです。プロパティ名がセット(setObj)を構成するオブジェクトのプロパティ値をvalと比較すると、hasOwnProperty()チェックが不要になり、追加された文字列のみが保証されます。セットにvaluesに表示されます。

使用例:

_var set = new StringSet();
set.add("foo");
set.add("bar");

alert(set.contains("foo")); // true
alert(set.contains("baz")); // false

set.values(); // ["foo", "bar"], though not necessarily in that order
set.remove("foo");
set.values(); // ["bar"]
_
20
Tim Down

通常のオブジェクトを使用して、JavaScriptのhasOwnPropertyでキーが存在するかどうかを確認してみませんか?

var x = {};
x['key'] = 'val';
x.hasOwnProperty('key'); // true //
x.hasOwnProperty('key2'); // false //

そして、これがより高度なユースケースです。

var x = {};
var prefix = 'item_';
for(var i=0;i<10;i++){
   x[prefix+i] = 'value '+(i+1);
}
x.hasOwnProperty('item_6'); // true //
x.hasOwnProperty('other key'); // false //

アイテムの削除は次のように実行できます。

delete x['key'];
11
Alin Purcaru

Dojoは必要ありません。これはJavascriptにネイティブです。オブジェクトを使用します。値ではなく、キーだけが必要なようです。ルックアップは一定時間です。

var st = {'aks':1, 'foo':1, 'bar':1};  // or could start with empty {}. 1 could be any value of any type, it's just short.

//add elements
st.baz = 1;

//or load up dynamically

myArrayOfStrings.forEach(function(key){
 st[key] = 1;
});


if("aks" in st){
  //do something
}
4
peller

ハッシュは、Setを実装するのに適した候補です。次のような関数を使用してセットを作成できます。

function set () {
    var result = {};
    for (var i = 0; i < arguments.length; i++) result[arguments[i]] = true;
    return result;
}

例えば:

x = set([1,2,2,4])
x[1] #==> true
x[3] #==> false
x[5] = true; # add element to the set
x[5] = false; # remove element from the set
0
fifigyuri

セットにはキーがありません。それらには値のセットしかありませんが、マップにはキー/値エンティティのペアがあります。

その結果、2つのオプションがあります。それぞれに欠点と利点があります。

  1. 上記のようにJavaScriptオブジェクトを使用できます。実際には、マップ/連想配列/ハッシュテーブルです。その利点の1つ(この種の構造でキーを保証できる)は、固有のアイテムです。この問題に関連する欠点は、まったく必要のない追加情報を保持する必要があることです。マップの値。 trueまたはその他の値。それは問題ではありません。なぜあなたはそれらが必要なのですか?

  2. 以前の欠点を解決するには、JavaScript配列の使用を検討してください。ただし、配列の動作がセットの動作のように見えるように、いくつかのラッパーを作成する必要があります。また、uniqueIdで検索する操作は、同じ操作でハッシュテーブルを検索する場合よりも遅くなるため、配列のすべての項目を反復処理する必要があります。

したがって、他の投稿にある例である配列よりもハッシュテーブルを優先する必要があると思います。しかし、おそらくデータ構造の変更を検討する必要があります。可能であれば、unselerss値を持つキーとしてuniqueIdを保持しないでください。一意のIDが、これらの一意のIDが使用される実際のオブジェクトを指すようにします。

PS:もう1つ。配列も実際にはオブジェクトです。結果として、それらはハッシュテーブル/マップとしても使用できます。

0
Alexandr

おそらく連想配列/ハッシュテーブル/辞書(正確にどのように呼ばれるかはわかりません)を使用し、セット要素をキーとして使用し、「その他」を値として使用します。

insert: mySet[key] = "Whatever";

delete: mySet[key] = null;

check: if (mySet[key] != null) { ... }
0
G B