字典:一一对一,键值对的储存方式。key:value,key不可以重复且无序,value可重复
Dictionary/dict/HashMap&TreeMap
集合:无序,不能重复的元素构成;常见实现方式 哈希表
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>set</title>
</head>
<body>
<script>
//封装集合
function Set(){
//属性
this.items = {}//js中的Object对象
//常见方法
Set.prototype.add = function(value){
//判断当前集合中是否包含该元素
if(this.has(value)){
return false
}
//将元素添加到集合中
this.items[value] = value//键和值都是value
return true
}
Set.prototype.has = function(value){
return this.items.hasOwnProperty(value)
}
Set.prototype.remove = function(value){
//1.判断该集合中是否包含该元素
if(!this.has(value)){
return false
}
//2.将元素从属性中删除
delete this.items[value]
return true
}
Set.prototype.clear = function(){
this.items = {}
}
Set.prototype.size = function(){
return Object.keys(this.items).length
}
//获得集合中所有的值
Set.prototype.values = function(){
return Object.keys(this.items)
}
}
var set = new Set()
set.add('123')
set.add('456')
console.log(set.add('456'))
console.log(set.add('abc'))
alert(set.values())
console.log(set.values())
console.log(set.remove('456'))
console.log(set.remove('456'))
alert(set.values())
console.log(set.has('123'))
console.log(set.has('456'))
alert(set.size())
set.clear()
alert(set.size())
</script>
</body>
</html>
//集合间的操作
//并集
Set.prototype.union = function(otherSet){
//this:集合对象A
//otherSet:集合对象B
//1.创建一个新的集合
var unionSet = new Set()
//2.将A集合中所有元素添加到集合中
var values = this.values()
for(var i = 0; i<values.length;i++){
unionSet.add(values[i])
}
//3.取出B集合中元素,判断是否需要加到新集合中
values = otherSet.values()
for(var i = 0;i<values.length;i++){
unionSet.add(values[i])
}
return unionSet
}
/*******************************************/
var setA = new Set()
setA.add(123)
setA.add(456)
setA.add('abc')
setA.add('def')
var setB = new Set()
setB.add('aaa')
setB.add('bbb')
setB.add('ddd')
setB.add('abc')
var unionSet = setA.union(setB)
console.log(unionSet.values())
alert(unionSet.values())
//交集
Set.prototype.intersection = function(otherSet){
//this:集合A
//otherSet:集合B
//1.创建新的集合
var intersectionSet = new Set()
//2.从A中取出一个元素,判断是否同时存在于集合B中,若是存在就放入新集合中
var values = this.values()
for(var i=0;i<values.length;i++){
var item= values[i]
if(otherSet.has(item)){
intersectionSet.add(item)
}
}
return intersectionSet
}
/***********************************************************************/
var setA = new Set()
setA.add(123)
setA.add('aaa')
setA.add('abc')
setA.add('def')
var setB = new Set()
setB.add('aaa')
setB.add('bbb')
setB.add('ddd')
setB.add('abc')
var intersectionSet = setA.intersection(setB)
console.log(intersectionSet.values())
alert(intersectionSet.values())
//差集
Set.prototype.difference = function(otherSet){
//this:集合A
//otherSet:集合B
//1.创建新的集合
var differenceSet = new Set()
//2.从A中取出一个元素,判断是否同时存在于集合B中,若是不存在就放入新集合中
var values = this.values()
for(var i=0;i<values.length;i++){
var item= values[i]
if(!otherSet.has(item)){
differenceSet.add(item)
}
}
return differenceSet
}
/*********************************************************************************/
var setA = new Set()
setA.add(123)
setA.add('aaa')
setA.add('abc')
setA.add('def')
var setB = new Set()
setB.add('aaa')
setB.add('bbb')
setB.add('ddd')
setB.add('abc')
var differenceSet = setA.difference(setB)
console.log(differenceSet.values())
alert(differenceSet.values())
//子集
Set.prototype.subset = function(otherSet){
//this:集合A
//otherSet:集合B
//遍历集合A中元素,若集合A中元素,在集合B中不存在,就返回false
//若是遍历完了A,依然没有返回false就返回true
var values = this.values()
for(var i=0;i<values.length;i++){
var item = values[i]
if(!otherSet.has(item)){
return false
}
return true
}
}
/***********************************************/
var setA = new Set()
setA.add(123)
setA.add('aaa')
setA.add('abc')
setA.add('def')
var setB = new Set()
setB.add('aaa')
setB.add('bbb')
setB.add('ddd')
setB.add('abc')
alert(setA.subset(setB))