const m=new MyMap([
["a",1],
["b",2]
])
class MyMap{
constructor(iterator=[]){
//判断是否是一个可迭代对象
if(typeof iterator[Symbol.interator]!=="function"){
throw new TypeError(`您所提供的${interator}不是一个可迭代对象`)
}
this._datas=[];
for(const item of iterator){
if(typeof item[Symbol.iterator]!=="function"){
throw new TypeError(`您所提供的${item}不是一个可迭代对象`)
}
const iterator=item[Symbol.iterator]()
const key=iterator.next().value
const value=iterator.next().value
this.set(key,value)
}
}
set(key,value){
const obj=this._getObj(key)//得到undefined或item
if(obj){
obj.value=value
}else{
this._datas.push({
key,
value
})
}
}
_getObj(key){
for(const item of this_datas){
if(this.isEqual(key,item.key)){
return item
}
}
}
//判断键名是否相等
isEqual(data1,data2){
if(data1===0&&data2===0){
return true
}
return Object.is(data1,data2)
}
//获取指定键名的键值
get(key){
const obj=this._getObj(key)
if(obj){
return obj.value
}
return undefined
}
//集合长度
get size(){
return this._datas.length;
}
//删除数据,返回值为是否删除成功
delete(key){
for(let i=0;i<this._datas.length;i++){
const element=this._datas[i];
if(this.isEqual(key,element.key)){
this._datas.splice(i,1)
return true
}
}
return false
}
//清空集合
clear(){
this._datas.length=0
}
//判断是否拥有该键名
has(key){
return this._getObj(key)!==undefined
}
//forEach遍历方法
forEach(callback){
for(const item of this._datas){
callback(item.value,item.key,this)
}
}
*[Symbol.iterator](){
for(const item of this._datas){
yield[item.key,item.value]
}
}
}