大家都知道Set
对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用,Set
对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
set对象中有一些属性和方法:
1.size属性:返回 Set 对象中的值的个数
2.add(value)方法:在Set
对象尾部添加一个元素。返回该Set
对象。
3.clear()方法:移除Set
对象内的所有元素。
4.delete()方法:移除Set
中与这个值相等的元素,返回Set.prototype.has(value)
在这个操作前会返回的值(即如果该元素存在,返回true
,否则返回false
)。Set.prototype.has(value)
在此后会返回false
。
5.has()方法:返回一个布尔值,表示该值在Set
中存在与否。
废话不多说,下面给大家展示下我写的代码!
class MySet{
constructor(iterator = []){
// 传递的内容必须是一个可迭代对象
if(typeof iterator[Symbol.iterator] !== "function"){
throw new TypeError(`您所提供的${iterator}不是一个可迭代对象`)
}
this._datas = [];
for (const item of iterator) {
// console.log(item)
this.add(item)
}
}
add(data){
if(!this.has(data)){
this._datas.push(data)
}
}
has(data){
for (const item of this._datas) {
if(this.isEqual(data,item)){
return true
}
}
return false;
}
delete(data){
for(let i = 0 ;i < this._datas.length;i++){
const element = this._datas[i]
if(this.isEqual(data,element)){
this._datas.splice(i,1)
return true
}
}
return false
}
clear(){
this._datas.length = 0
}
get size(){
return this._datas.length
}
forEach(callback){
for (const item of this._datas) {
callback(item,item,this)
}
}
*[Symbol.iterator](){
for (const item of this._datas) {
yield item
}
}
isEqual(data1,data2){
if(data1 === 0 && data2 === 0){
return true
}
return Object.is(data1,data2)
}
}