/**
* 接受一个可迭代的参数
* @param {*} iterable
* 正确格式为[[key,value],[key,value]]
*/
const Mymap = (() => {
// 设置私有属性
const getObj = Symbol('getObj')
const arrKey = Symbol('arrKey')
const isEqual = Symbol('isEqual')
return class Mymap {
/**
* 接受一个可迭代的参数
* @param {*} iterable
* 正确格式为[[key,value],[key,value]]
*/
constructor(iterable = []) {
this[arrKey] = []
// 判断格式是否真确
// 正确格式为[[key,value],[key,value]]
if (typeof iterable[Symbol.iterator] !== 'function') {
throw new TypeError(`${iterable} is not an iterator`)
}
for (const item of iterable) {
//数组内的格式是否正确
// 正确格式为[[key,value],[key,value]]
if (typeof item[Symbol.iterator] !== 'function') {
throw new TypeError(`${item} is not iterator`)
}
// 将其key与value 值迭代出来
const iterator = item[Symbol.iterator]()
const key = iterator.next().value;
const value = iterator.next().value;
this.set(key, value)
}
}
/**
* 写入key 与 value
* 当其key重复时 当前key的value会覆盖之前value
* 若是新key 则添加
* @param {*} key
* @param {*} value
*/
set(key, value) {
const obj = this[getObj](key)
if (obj) {
obj.value = value
} else {
this[arrKey].push({
key,
value
})
}
}
/**
* 查看是否拥有某个key值
* @param {*} key
* 返回值为 true or false
*/
has(key) {
return this[getObj](key) !== undefined;
}
/**
* 查看某个一key值得value
* @param {*} key
* 返回值为 value or false
*/
get(key) {
const obj = this[getObj](key);
return obj !== undefined ? obj.value : false
}
/**
* 删除某一个key
* @param {*} key
* 返回值为 true or false
*/
delete(key) {
for (let i = 0; i < this[arrKey].length; i++) {
let obj = this[arrKey][i]
if (obj.key === key) {
this[arrKey].splice(i, 1)
return true;
}
}
return false;
}
/**
* 清空
*/
clear() {
this[arrKey].length = 0;
}
/**
* 遍历
* 与Array的forEach有区别
* 第一项的值为 value
* 第二项的值为 key
* 第三项的值为 this
* @param {*} callback
*/
forEach(callback) {
for (const { key, value } of this[arrKey]) {
callback(value, key, this)
}
}
/**
* 获取键值对的数量 与Array的length 一样
*/
get size() {
return this[arrKey].length;
}
/**
* 使其成为可迭代对象
*/
*[Symbol.iterator]() {
for (const { key, value } of this[arrKey]) {
yield [key, value]
}
}
/**
* 检索key值
* @param {*} key
*/
[getObj](key) {
for (const item of this[arrKey]) {
if (this[isEqual](key, item.key)) {
return item;
}
}
// return false;
}
/**
* 判断两个key值是否相等
* @param {*} key1
* @param {*} key2
*/
[isEqual](key1, key2) {
if (key1 === 0 && key2 === 0) {
return true;
}
return Object.is(key1, key2)
}
}
})()