/** * @description: 手动实现一个map */ const MyMap = (() => { const judgeIterator = Symbol("判断是否为可迭代的对象函数"); const judgeExitByKey = Symbol("通过键来判断迭代器里面是否存在对应的键值对"); const isEqual = Symbol("判断两个值是否相等的函数"); const datas = Symbol("用来保存所有的键值对"); return class MyMap { constructor(iterator = []) { this[datas] = []; // 用一个对象来组装对应的键值对 if (this[judgeIterator](iterator)) { // 第一次迭代获取每一个键值对 for (const item of iterator) { // 判断对应的键值对是否为一个可迭代的对象 if (this[judgeIterator](item)) { // 生成一个一个迭代器 const generatorIterator = item[Symbol.iterator](); // 初始化第一个参数,也就是map的key const key = generatorIterator.next().value; // 获取第一个参数, map key 对应的值 const value = generatorIterator.next().value; // 把对应的键值对加入到map里面去,但是要判断map里面是否存在 this.set(key, value) } } } } /** * @description: 判断一个对象是否为一个可迭代对象 * @param : 输入的对象 * @return: {boolean} 结果 */ [judgeIterator](obj) { if (typeof obj[Symbol.iterator] !== "function") { throw new Error(`你输入的${obj}不是一个可迭代对象`) } return true; } [judgeExitByKey](key) { for (const item of this[datas]) { // 获取对应的键 if (this[isEqual](key, item.key)) { return item; } } return undefined; } /** * @description: 判断两个值是否相等 * @param : data1 需要判断的第一个值 * @param : data2 需要判断的第er个值 * @return: 返回结果 */ [isEqual](data1, data2) { if (data1 === 0 && data2 === 0) { return true; } return Object.is(data1, data2); } /** * @description: 通过键来判断map里面是否存在 * @param : key 键 * @return: {boolean} 结果 */ has(key) { return this[judgeExitByKey](key) !== undefined; } /** * @description: 给map设置值 * @param : key 设置的key * @param : value 设置的value * @return: */ set(key, value) { if (this.has(key)) { // 如果存在,那么就要修改对应键值对的值 let obj = this[judgeExitByKey](key); obj.value = value; } else { // 否则就直接添加 this[datas].push({ key, value, }) } } /** * @description: 通过键来删除对应的键值对 * @param : key * @return: 结果 */ 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 this[datas]; } } } /** * @description: 获取map的长度 */ get size() { return this[datas].length; } /** * @description: 清空map */ clear() { this[datas].length = 0; } *[Symbol.iterator]() { for (const item of this[datas]) { yield [item.key, item.value]; } } /** * @description: map 的forEach 方法 */ forEach(callback) { for (const item of this[datas]) { callback(key, value, this[datas]); } } } })() // 调用 const arr = [['a', 1], ['b', 2], ['c', 4], ['a', 5]] const mp = new MyMap(arr); // 和map 的使用是一样的