JavaScript是否具有集合数据结构的实现?

时间:2010-03-26 13:13:57

标签: javascript data-structures set

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

到目前为止,我只找到Closure Library's structs.Set,但我不喜欢它修改我的数据这一事实。

5 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:11)

您可以围绕我的jshashtable提供的哈希表的键构建一个简单的包装器。我有一个人在某个地方敲门,我将在以后挖掘出来。

<强>更新

我已经完成并测试了HashSet的实现,并将其上传到GitHub上的jshashtable项目。您可以download itview the source

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

答案 2 :(得分:2)

我认为除了将对象的哈希代码存储在对象本身之外,还有办法处理对象的哈希代码。严格地说,使用简单的线性搜索可以创建没有散列的集合类,但这很难有效。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

在ES6版本的Javascript中,您为setcheck compatibility with your browser)内置了类型。

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

添加元素到集合,您只需使用.add() O(1)运行numbers.add(4); // Set {1, 2, 4} numbers.add(6); // Set {1, 2, 4, 6} 并添加要设置的元素(如果它不存在)或者没有,如果它已经存在。您可以在那里添加任何类型的元素(数组,字符串,数字)

.size

检查集合中的元素数量,您只需使用O(1)即可。也在numbers.size; // 4

中运行
.delete()

从集合中移除元素,请使用O(1)。如果值存在(并且已被删除),则返回true;如果值不存在,则返回false。也在numbers.delete(2); // true numbers.delete(2); // false 中运行。

.has()

要在集合use O(1)检查元素是否存在,如果元素在集合中则返回true,否则返回false。也在numbers.has(3); // false numbers.has(1); // true 中运行。

numbers.clear();

除了您想要的方法之外,还有一些方法:

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

还有一个Weakset,它只允许添加对象类型的值。