设置数据结构的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的值。