设置数据结构的JavaScript实现

我正在寻找一个在JavaScript中设置数据结构体面的实现。 它应该能够支持纯JavaScript对象的元素。

到目前为止,我只find了Closure Library的结构 。但是,我不喜欢它修改我的数据的事实。

有任何想法吗?

你可以围绕我的jshashtable提供的哈希表的键构build一个简单的包装。 我有一个地方,我会稍后挖掘。

UPDATE

我已经完成并testing了一个HashSet的实现,并将其上传到Google Code的jshashtable项目。 您可以下载它或查看源代码 。

var s = new HashSet(); var o1 = {name: "One"}, o2 = {name: "Two"}; s.add(o1); s.add(o2); s.values(); // Array containing o1 and o2 

ECMAScript 6有它

规格: http : //www.ecma-international.org/ecma-262/6.0/#sec-set-constructor

用法: https : //github.com/lukehoban/es6features#map–set–weakmap–weakset

例:

 var s = new Set() s.add("hello").add("goodbye").add("hello") s.size === 2 s.has("hello") === true 

一个模块,实现它的浏览器没有支持: https : //github.com/medikoo/es6-set

使用ECMAScript 2015(ES6)标准设置数据结构非常容易使用:

 var mySet = new Set(); mySet.add(1); mySet.add(5); mySet.add("some text"); var o = {a: 1, b: 2}; mySet.add(o); mySet.has(1); // true mySet.has(3); // false, 3 has not been added to the set mySet.has(5); // true mySet.has(Math.sqrt(25)); // true mySet.has("Some Text".toLowerCase()); // true mySet.has(o); // true mySet.size; // 4 mySet.delete(5); // removes 5 from the set mySet.has(5); // false, 5 has been removed mySet.size; // 3, we just removed one value 

更新那些使用AngularJs的人

请注意,这些设置不适用于ng-repeat 。 所以最好使用一个数组,并应用一个独特的filter

我不认为有办法处理对象的哈希代码,而不是将其存储在对象本身。 严格地说,可以使用简单的线性search来创build一个没有散列的集合类,但是这不会有效。

我喜欢Simple-JS-Set (可能是因为我写的)。 它支持任何types的JavaScript对象。 它有以下API:

  • Set(hashFunction) :(Constructor)使用给定的hashFunction实例化一个新的集合(默认为JSON.stringify
  • add(item) :添加一个项目到集合中
  • remove(item) :从集合中删除一个项目
  • contains(item) :返回是否该项目包含在集合中
  • size() :返回集合中唯一项目的数量
  • each(function(item), thisObj) :在thisObj上下文中执行集合中每个项目的thisObj

在ES6版本的Javascript中,您已经内置了types( 与您的浏览器兼容 )。

 var numbers = new Set([1, 2, 4]); // Set {1, 2, 4} 

添加元素到集合中,只需使用在O(1)运行的.add() ,并添加要设置的元素(如果不存在),或者如果已经存在,则不执行任何操作。 你可以添加任何types的元素(数组,string,数字)

 numbers.add(4); // Set {1, 2, 4} numbers.add(6); // Set {1, 2, 4, 6} 

检查集合中元素的数量 ,可以简单地使用.size 。 也运行在O(1)

 numbers.size; // 4 

要从设置中删除元素,请使用.delete() 。 如果值存在(并被删除),则返回true;如果值不存在,则返回false。 也运行在O(1)

 numbers.delete(2); // true numbers.delete(2); // false 

检查元素是否存在于set中,使用.has() ,如果元素在set中则返回true,否则返回false。 也运行在O(1)

 numbers.has(3); // false numbers.has(1); // true 

除了你想要的方法之外,还有几个额外的方法:

  • numbers.clear(); 只会删除集合中的所有元素
  • numbers.forEach(callback); 按照插入顺序迭代集合的值
  • numbers.entries(); 创build所有值的迭代器
  • numbers.keys(); 返回与numbers.values()相同的集合的键

还有一个Weakset允许只添加对象types的值。