实现MapIterator
class _MapIterator {
constructor(value) {
this._start = 0;
this["[[Entries]]"] = value;
}
next() {
const maxLen = Object.keys(this["[[Entries]]"]).length;
if (this._start < maxLen) {
const { key, value } = this["[[Entries]]"][this._start++];
return { value: [key, value], done: false }
}
return { value: undefined, done: true }
}
}
实现Map
class _Map {
constructor(payload) {
const it = payload ? payload[Symbol.iterator]() : null;
let entries = Object.create(null);
let res = [];
if (it) {
let t = it.next(), i = 0;
while(!t.done) {
const fIndex = res.indexOf(t.value[0]);
if (fIndex > -1) {
entries[fIndex].value = t.value[1];
} else {
res.push(t.value[0]);
entries[i++] = { key: t.value[0], value: t.value[1] };
}
t = it.next();
}
}
this["[[Entries]]"] = entries;
}
get size() {
return Object.keys(this["[[Entries]]"]).length;
}
get(key) {
const it = this[Symbol.iterator]();
let t = it.next();
while(!t.done) {
if (t.value[0] === key) return t.value[1];
t = it.next();
}
return;
}
set(key, value) {
const it = this[Symbol.iterator]();
let t = it.next();
let i = 0;
while(!t.done) {
if (t.value[0] === key) {
break;
}
t = it.next();
i++;
}
this["[[Entries]]"][i] = { key, value };
return this;
}
clear() {
this["[[Entries]]"] = Object.create(null);
}
delete(key) {
const fItem = Object.entries(this["[[Entries]]"]).find(arr => arr[1].key === key);
if (fItem) {
return delete this["[[Entries]]"][fItem[0]];
}
return false;
}
values() {
let start = 0;
return {
next() {
if (start++ < this.size) {
const value = this["[[Entries]]"][start].value;
return { value, done: false }
}
return { value: undefined, done: true }
}
}
}
keys() {
let start = 0;
return {
next() {
if (start++ < this.size) {
const value = this["[[Entries]]"][start].key;
return { value, done: false }
}
return { value: undefined, done: true }
}
}
}
entries() {
return new _MapIterator(this["[[Entries]]"]);
}
forEach(callback) {
Object.values(this["[[Entries]]"]).forEach(v => { callback(v.value, v.key, this) });
}
has(key) {
return Object.values(this["[[Entries]]"]).some(v => v.key === key);
}
[Symbol.iterator]() {
return new _MapIterator(this["[[Entries]]"]);
}
}
测试效果图如下: