是否有像JavaScript中的Java Set这样的数据结构?

我想在JavaScript中使用可用于存储ID数量的数据结构。 我应该能够检查该集合中是否存在密钥,例如Java集合。

我希望得到如下相同的行为(此代码在Java中):

Set st = new HashSet(); //add elemets if(st.contains("aks") ){ //do something } 

我想要一个类似上面代码的JavaScript / dojo。

我编写了一个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; }; } 

关于实现的说明: valStringSet实现在内部使用的对象,对于每个集都是唯一的。 将属性名称组成set( 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 } 

可能使用关联数组/ Hashtable /字典(我不知道它是如何完全调用的),使用set元素作为键和“其他任何”作为值。

 insert: mySet[key] = "Whatever"; delete: mySet[key] = null; check: if (mySet[key] != null) { ... } 

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 

集合没有密钥。 它们只有一组值,但是映射具有一对键/值实体。

因此,您有2个选项。 他们每个人都有其缺点和优点:

  1. 您可以使用上面描述的JavaScript对象。 实际上它是一个map / associative数组/哈希表。 它的一个优点 – 你可以保证这种结构的钥匙 – 是独一无二的物品。 它的缺点与问题有关 – 您必须保留一些您根本不需要的额外信息。 地图的价值。 真实或其他一些价值观。 不要紧。 你为什么需要它们?

  2. 要解决先前的缺点,您可以考虑使用JavaScript数组。 但是,您必须编写一些包装器,以便数组的行为看起来像设置行为。 此外,由uniqueId搜索的操作将比hashtables的相同操作慢,因为您必须通过数组的所有项进行迭代。

所以,我认为你应该更喜欢哈希表到数组,你可以在其他post中找到这些例子。 但是你应该考虑改变你的数据结构。 如果可能的话,不要将uniqueId作为具有unselerss值的键。 让您的唯一ID指向一些使用这些唯一ID的真实对象。

PS:还有一件事。 实际上,数组也是对象。 因此,它们也可以用作哈希表/地图。