我想在JavaScript中使用可用于存储ID数量的数据结构。我应该能够检查该集合中是否存在密钥,例如Java Sets。
我希望得到如下相同的行为(此代码在Java中):
Set<String> st = new HashSet<String>();
//add elemets
if(st.contains("aks") ){
//do something
}
我想要一个类似上面代码的JavaScript / dojo。
答案 0 :(得分:20)
我编写了一个JavaScript HashSet实现,可以执行您想要的操作并允许任何对象成为该集合的成员:http://code.google.com/p/jshashtable
但是,如果您只需要存储字符串,则可以通过将set成员存储为普通Object的属性名称来更简单地执行某些操作。例如:
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"]
答案 1 :(得分:11)
为什么不使用普通对象并检查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'];
答案 2 :(得分:4)
不需要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
}
答案 3 :(得分:0)
可能使用关联数组/ Hashtable /字典(我不知道它是如何完全调用的),使用set元素作为键,使用“其他任何”作为值。
insert: mySet[key] = "Whatever";
delete: mySet[key] = null;
check: if (mySet[key] != null) { ... }
答案 4 :(得分:0)
Hash是实现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
答案 5 :(得分:0)
设置没有键。它们只有一组值,但是映射具有一对键/值实体。
因此,您有2个选项。他们每个人都有其缺点和优点:
您可以使用上述JavaScript对象。实际上它是一个map / associative数组/哈希表。它的一个优点 - 你可以保证这种结构的钥匙 - 是独一无二的物品。它的缺点与问题有关 - 您必须保留一些您根本不需要的额外信息。地图的价值。真实或其他一些价值观。不要紧。你为什么需要它们?
要解决之前的缺点,您可以考虑使用JavaScript数组。但是,您必须编写一些包装器,以便数组的行为看起来像设置行为。此外,由uniqueId搜索的操作将比hashtables的相同操作慢,因为您必须遍历数组的所有项目。
所以,我认为你应该更喜欢哈希表到数组,你可以在其他帖子中找到这些例子。但是你应该考虑改变你的数据结构。如果可能的话,不要将uniqueId作为具有unselerss值的键。让您的唯一ID指向一些使用这些唯一ID的真实对象。
PS:还有一件事。数组实际上也是对象。因此,它们也可以用作哈希表/地图。