利用ES5实现集合其实和字典很像,只不过在集合种,键=值,这样就可以确保了集合的互异性,代码如下:
var Set2=function()
{
var items={} //同字典的实现,为空对象类型
var length=0
this.has=function(element)
{
return items.hasOwnProperty(element) //过滤到继承属性
}
this.add=function(element){
if(!this.has(element))
{
items[element]=element //这里使用[]的原因是,要动态访问并且修改 不可用.语法 这里的element为字符串
length++
return element
}
else{
return false
}
}
this.remove=function(element)
{
if(this.has(element))
{
delete items[element]
length--
return true
}
else{
return false
}
}
this.value=function()
{
var item=[]
for (var i in items)
{
if(items.hasOwnProperty(i))
{
item.push(items[i])
}
}
return item
}
this.size_1=function()
{
return length
}
this.size_2=function()
{
var count=0
for(var i in items) //遍历其键
{
if(items.hasOwnProperty(i) ) //检查他自己是否有i这个属性,确保该属性是他自己的而不是继承来的
{
count++}
}
return count
}
this.size_3=function() //静态方法的使用 IE6不兼容 Object.key()获取其键 作为数组返回
{
return Object.keys(items).length
}
//并集实现
this.union=function(otherSet)
{
var resultSet=new Set2()
var arr=this.value() //提取自己的值
for(var i=0;i<arr.length;i++ )
{
resultSet.add(arr[i])
}
var arr=otherSet.value() //要并的集合的值
for(var i=0;i<arr.length;i++ )
{
resultSet.add(arr[i])
}
return resultSet
}
//交集
this.intersection=function(otherSet)
{
var arr=this.value()
var resultSet=new Set2()
for(var i=0;i<arr.length;i++)
{
if(otherSet.has(arr[i]))
{
resultSet.add(arr[i])
}
}
return resultSet
}
//差集是交集的相反实现
this.difference=function(otherSet)
{
var resultSet=new Set2()
var arr=this.value()
for(var i=0;i<arr.length;i++)
{
if(!otherSet.has(arr[i]))
{
resultSet.add(arr[i])
}
}
return resultSet
}
}
在es6中已经新引入了set()直接var b=new Set(),即可生成一个b集合,它自带add、clear、delete、has、key、value、entries、forEach方法,key和value返回值相同。直接来看一下交集并集差集的实现:
var union=new Set([...s,...b]) //...拆分对象
var intersection=new Set([...s].filter(value=>b.has(value)))
//filter方法可以将()中执行后weitue
var difference=new Set([...s].filter(value=>!b.has(value)))