IDの数を格納するために使用できるJavaScriptのデータ構造を使用したいと思います。 Javaセットのように、そのセットにキーがすでに存在するかどうかを確認できるはずです。
次のように同じ動作を実現したいと思います(このコードはJavaです)。
Set<String> st = new HashSet<String>();
//add elemets
if(st.contains("aks") ){
//do something
}
上記のコードと同等のJavaScript/dojoが必要です。
私はあなたが望むことをし、どんなオブジェクトもセットのメンバーになることを可能にする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"]
_
通常のオブジェクトを使用して、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'];
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
}
ハッシュは、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
セットにはキーがありません。それらには値のセットしかありませんが、マップにはキー/値エンティティのペアがあります。
その結果、2つのオプションがあります。それぞれに欠点と利点があります。
上記のようにJavaScriptオブジェクトを使用できます。実際には、マップ/連想配列/ハッシュテーブルです。その利点の1つ(この種の構造でキーを保証できる)は、固有のアイテムです。この問題に関連する欠点は、まったく必要のない追加情報を保持する必要があることです。マップの値。 trueまたはその他の値。それは問題ではありません。なぜあなたはそれらが必要なのですか?
以前の欠点を解決するには、JavaScript配列の使用を検討してください。ただし、配列の動作がセットの動作のように見えるように、いくつかのラッパーを作成する必要があります。また、uniqueIdで検索する操作は、同じ操作でハッシュテーブルを検索する場合よりも遅くなるため、配列のすべての項目を反復処理する必要があります。
したがって、他の投稿にある例である配列よりもハッシュテーブルを優先する必要があると思います。しかし、おそらくデータ構造の変更を検討する必要があります。可能であれば、unselerss値を持つキーとしてuniqueIdを保持しないでください。一意のIDが、これらの一意のIDが使用される実際のオブジェクトを指すようにします。
PS:もう1つ。配列も実際にはオブジェクトです。結果として、それらはハッシュテーブル/マップとしても使用できます。
おそらく連想配列/ハッシュテーブル/辞書(正確にどのように呼ばれるかはわかりません)を使用し、セット要素をキーとして使用し、「その他」を値として使用します。
insert: mySet[key] = "Whatever";
delete: mySet[key] = null;
check: if (mySet[key] != null) { ... }