实现一个Set数据结构要知道它有哪些特点和方法
特点:键和值都相等,且键和值都可以是对象
-
可以接受一个数组为参数,其它都报错
-
add,添加成功true,添加失败false,size加1
-
has,如果有的话true,没有为false
-
delete,删除成功为true,删除失败false,size减1
-
clear,清空操作,size也为0
-
keys,遍历所有的keys值
-
values,遍历所有的values值
-
Entries,遍历keys值和values值
-
forEach,里面接收回调函数,第一个参数为键,第二个值为值,第三个参数为set实例本身
实现一个Set方法可以按照以上要求写出代码。直接上代码
class mySet {
constructor(optionsArr = []) {
// 如果参数为Set和Map就转出数组
if(!(optionsArr instanceof Map) || !(optionsArr instanceof Set)) optionsArr = Array.from(optionsArr)
// 不是类似数组的结构就直接报错
if (!(optionsArr instanceof Array)) throw Error('参数只能为类似数组结构')
this.list = {}
this.size = optionsArr.length
optionsArr.forEach(val => {
this.list[val] = val
})
}
add(val) {
if (!this.list[val]) {
this.list[val] = val
this.size++
return true
}
return false
}
has(val) {
// 判断下是否是对象,如果是对象返回false
if (val !== null && typeof val === 'object') return false
return this.list.hasOwnProperty(val)
}
delete(val) {
if (this.list[val]) {
delete this.list[val]
this.size--
return true
}
return false
}
clear() {
this.list = {}
this.size = 0
}
keys() {
// 键和值是相等的,以值为主
return Object.values(this.list)
}
values() {
// 键和值是相等的,以值为主
return Object.values(this.list)
}
entries() {
// 键和值是相等的,以值为主
return Object.entries(this.list).map(item => {
item[0] = item[1]
return item
})
}
forEach(callback) {
let keys = this.keys()
for (let i = 0; i < keys.length; i++) {
callback(keys[i], keys[i], this)
}
}
}