集合的特点:
1、 集合里面的项是无序的, 没有下标值概念。
2、 集合里的元素不允许有重复。
3、ES6已经封装了Set集合类 可以直接使用 这里探讨的是内部原理的实现
// 封装集合类
function Set() {
// 默认属性 利用对象来保存 数组不适合因为数组是有序的
this.items = {}
// 方法
// 1、声明方法:向集合添加一个新的项
this.add = function (value) {
if (this.has(value)) return false
return this.items[value] = value
}
// 2、声明方法:从集合移除一个项
this.remove = function (value) {
if (!this.has(value)) return false
return delete this.items[value]
}
// 3、声明方法:如果集合中存在该项返回true 否则返回false
this.has = function (value) {
return this.items[value] === value
// return this.items.hasOwnProperty(value) 效果一样
}
// 4、声明方法:移除集合中的所有项
this.clear = function () {
return this.items = {}
}
// 5、声明方法:返回集合包含的项的个数
this.size = function () {
return this.values().length
}
// 6、声明方法:返回一个包含集合中所有项的数组
this.values = function () {
return Object.keys(this.items)
}
// 7、声明方法:集合中的并集操作
this.union = function (otherSet) {
let unionSet = new Set()
let values = this.values()
let otherValues = otherSet.values()
// 遍历两个集合中的值 添加到items中
for (let i in values) {
unionSet.add(values[i])
}
for (let i in otherValues) {
unionSet.add(otherValues[i])
}
return unionSet
}
// 8、声明方法:集合的交集操作
this.intersection = function (otherSet) {
let intersectionSet = new Set()
let values = this.values()
for (let i in values) {
let item = values[i]
if (otherSet.has(item)) {
intersectionSet.add(item)
}
}
return intersectionSet
}
// 9、声明方法:集合的差集操作
this.difference = function (otherSet) {
let differenceSet = new set()
let values = this.values()
for (let i in values) {
let item = values[i]
if (!otherSet.has(item)) {
differenceSet.add(item)
}
}
return differenceSet
}
// 10、声明方法:集合是否是传入参数的子集
this.isSubset = function (otherSet) {
let values = this.values()
for (let i in values) {
let item = values[i]
if (!otherSet.has(item)) {
return false
}
}
return true
}
}
调试信息:
// 调试
// const set = new Set()
// set.add('张三')
// set.add('李四')
// set.add('王五')
// console.log(set.items) // {张三: "张三", 李四: "李四", 王五: "王五"}
// console.log(set.has('张三')) // true
// // set.clear()
// // console.log(set.items) 打印结果: {}
// console.log(set.size()) // 3
// console.log(set.values()) //["张三", "李四", "王五"]
// set.remove('王五')
// console.log(set.values()) //["张三", "李四"]
// -------------并集调试---------------
// const setA = new Set()
// const setB = new Set()
// const unionSet = setA.union(setB)
// console.log(unionSet.values()) // []
// -------------交集调试(与差集相反)---------------
// const setA = new Set()
// setA.add('张三')
// setA.add('王五')
// const setB = new Set()
// setB.add('张三')
// setB.add('李四')
// const intersectionset = setA.intersection(setB)
// console.log(intersectionset.values()) //['张三']
总结:
1、obj[]和.创建键值的区别 []是动态创建,适用于创建没有固定名字的键值对, .适用于有固定名字的键值对,避免发生替代。
2、obj[]和.获取键值的区别 如果创建是是利用[]动态创建,那么获取键值是请使用[]获取, .方法无法获取到[]动态创建的键值 undefined。
3、并集:返回两个集合中不包含重复的数据 交集:返回两个集合中重复的数据 差集:返回交集后剩下的那部分 子集:验证一个集合是否全处于另一个集合中。
4、集合是键值对存在的
5、子集验证通过遍历子集,再看父集(这里的父集就是封装集合中key数组)是否全包含,如果有一个没包含就不是子集