class MyMap{
constructor(iterator = []){
if(typeof iterator[Symbol.iterator] !== "function"){
throw new TypeError(`您所提供的${iterator}不是一个可迭代对象`)
}
this._datas = [];
for (const item of iterator) {
// item也是一个可迭代对象
if(typeof item[Symbol.iterator] !== "function"){
throw new TypeError(`您所提供的${item}不是一个可迭代对象`)
}
// this.set(item[0],item[1])
const iterator = item[Symbol.iterator]()//["a",1]
const key = iterator.next().value
const value = iterator.next().value
this.set(key,value)
}
}
set(key,value){
// console.log(key,value)
const obj = this._getObj(key)//undefined item
if(obj){
obj.value = value
}else{
this._datas.push({
key : key,
value : 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)//undefined {"b":2}
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(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]
}
}
}