1. /**
    2. * 接受一个可迭代的参数
    3. * @param {*} iterable
    4. * 正确格式为[[key,value],[key,value]]
    5. */
    6. const Mymap = (() => {
    7. // 设置私有属性
    8. const getObj = Symbol('getObj')
    9. const arrKey = Symbol('arrKey')
    10. const isEqual = Symbol('isEqual')
    11. return class Mymap {
    12. /**
    13. * 接受一个可迭代的参数
    14. * @param {*} iterable
    15. * 正确格式为[[key,value],[key,value]]
    16. */
    17. constructor(iterable = []) {
    18. this[arrKey] = []
    19. // 判断格式是否真确
    20. // 正确格式为[[key,value],[key,value]]
    21. if (typeof iterable[Symbol.iterator] !== 'function') {
    22. throw new TypeError(`${iterable} is not an iterator`)
    23. }
    24. for (const item of iterable) {
    25. //数组内的格式是否正确
    26. // 正确格式为[[key,value],[key,value]]
    27. if (typeof item[Symbol.iterator] !== 'function') {
    28. throw new TypeError(`${item} is not iterator`)
    29. }
    30. // 将其key与value 值迭代出来
    31. const iterator = item[Symbol.iterator]()
    32. const key = iterator.next().value;
    33. const value = iterator.next().value;
    34. this.set(key, value)
    35. }
    36. }
    37. /**
    38. * 写入key 与 value
    39. * 当其key重复时 当前key的value会覆盖之前value
    40. * 若是新key 则添加
    41. * @param {*} key
    42. * @param {*} value
    43. */
    44. set(key, value) {
    45. const obj = this[getObj](key)
    46. if (obj) {
    47. obj.value = value
    48. } else {
    49. this[arrKey].push({
    50. key,
    51. value
    52. })
    53. }
    54. }
    55. /**
    56. * 查看是否拥有某个key值
    57. * @param {*} key
    58. * 返回值为 true or false
    59. */
    60. has(key) {
    61. return this[getObj](key) !== undefined;
    62. }
    63. /**
    64. * 查看某个一key值得value
    65. * @param {*} key
    66. * 返回值为 value or false
    67. */
    68. get(key) {
    69. const obj = this[getObj](key);
    70. return obj !== undefined ? obj.value : false
    71. }
    72. /**
    73. * 删除某一个key
    74. * @param {*} key
    75. * 返回值为 true or false
    76. */
    77. delete(key) {
    78. for (let i = 0; i < this[arrKey].length; i++) {
    79. let obj = this[arrKey][i]
    80. if (obj.key === key) {
    81. this[arrKey].splice(i, 1)
    82. return true;
    83. }
    84. }
    85. return false;
    86. }
    87. /**
    88. * 清空
    89. */
    90. clear() {
    91. this[arrKey].length = 0;
    92. }
    93. /**
    94. * 遍历
    95. * 与Array的forEach有区别
    96. * 第一项的值为 value
    97. * 第二项的值为 key
    98. * 第三项的值为 this
    99. * @param {*} callback
    100. */
    101. forEach(callback) {
    102. for (const { key, value } of this[arrKey]) {
    103. callback(value, key, this)
    104. }
    105. }
    106. /**
    107. * 获取键值对的数量 与Array的length 一样
    108. */
    109. get size() {
    110. return this[arrKey].length;
    111. }
    112. /**
    113. * 使其成为可迭代对象
    114. */
    115. *[Symbol.iterator]() {
    116. for (const { key, value } of this[arrKey]) {
    117. yield [key, value]
    118. }
    119. }
    120. /**
    121. * 检索key值
    122. * @param {*} key
    123. */
    124. [getObj](key) {
    125. for (const item of this[arrKey]) {
    126. if (this[isEqual](key, item.key)) {
    127. return item;
    128. }
    129. }
    130. // return false;
    131. }
    132. /**
    133. * 判断两个key值是否相等
    134. * @param {*} key1
    135. * @param {*} key2
    136. */
    137. [isEqual](key1, key2) {
    138. if (key1 === 0 && key2 === 0) {
    139. return true;
    140. }
    141. return Object.is(key1, key2)
    142. }
    143. }
    144. })()