JavaScript数据结构之集合
集合是由一组无序且唯一(即不能重复)的项组成的,这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中。
1.创建一个集合
目前的JavaScript实现是基于2011年6月发布的ECMAScript5.1,它包括了Array类的实现,ECMAScript6包括了set类的实现。
注意:下面实现的类就是以ECMAScript6类的实现为基础的。
Set类的骨架:
function Set(){
var items={
};
}
- add(value):向集合添加一个新的项
- remove(value):从集合里移除一个值
- has(value):如果值在集合中,返回true,否则返回false
- clear():移除集合中的所有项
- size():返回集合所包含元素的数量,与数组的length属性类似
- values():返回一个包含集合中所有值的数组
has(value)方法
this.has=function(value){
return value in items;
};
即使使用对象来存储集合的值,就可以用JavaScript的in操作符来验证给定的值是否是items对象的属性。
但这个方法还有更多的实现方式,如下:
this.has=function(value){
return items.hasOwnProperty(value);
};
所有JavaScript对象都有hasOwnProperty方法。这个方法返回一个表明对象是否具有特定属性的布尔值。
add方法
this.has=function(value){
if(!this.has(value){
items[value]=value;
}
return false;
};
对于给定的value,可以检查它是否存在于集合中。如果不存在,就把value添加到集合中,返回true,表示添加了这个值。如果集合中已经有了这个值,返回false,表示没有添加它。
remove和clear方法
this.remove=function(value){
if(this.has(value){
delete items[value];
return false;
}
return false;
};
在remove方法中,会验证给定的value是否存在于集合中。如果存在,就从集合中移除value,返回true,表示被移除,否则返回false。
使用Set类的示例代码如下:
var set = new Set();
set.add(1);
set.add(2);
如果想要移除集合中的所有值,可以用clear方法:
this.clear = function(){
items={
}:
};
要重置items对象,需要做的只是把一个空对象重新赋值给它。当然也可以迭代集合,用remove方法依旧移除所有的值。
size方法
下一个要实现的是 size 方法(返回集合中有多少项)。这个方法有三种实现方式。
-
第一种方法是使用一个 length 变量,每当使用 add 或 remove 方法时控制它,就像在上一章中使用 LinkedList 类一样。
-
第二种方法,使用JavaScript内建的 Object 类的一个内建函数(ECMAScript 5以上版本):
this.size = function(){
return Object.keys(items).length; //{4}
};
JavaScript的 Object 类有一个 keys 方法,它返回一个包含给定对象所有属性的数组。在这种情况下,可以使用这个数组的 length 属性,来返回 items 对象的属性个数。
以上代码只能在现代浏览器中运行(比如IE9以上版本、Firefox 4以上版本、Chrome 5以上版本、Opera 12以 上版本、Safari 5以上版本,等等
)。
- 第三种方法是手动提取 items 对象的每一个属性,记录属性的个数并返回这个数字。这个方法可以在任何浏览器上运行,和之前的代码是等价的:
this.sizeLegacy = function(){
var count = 0;
f