实现SetIterator
class _SetIterator {
constructor(value) {
this._start = 0;
this["[[Entries]]"] = value;
}
next() {
const maxLen = Object.keys(this["[[Entries]]"]).length;
if (this._start < maxLen) {
return { value: this["[[Entries]]"][this._start++], done: false }
}
return { value: undefined, done: true }
}
}
实现Set
class _Set {
constructor(payload) {
const it = payload ? payload[Symbol.iterator]() : null;
let entries = Object.create(null);
let res = Object.create(null);
if (it) {
let t = it.next(), i = 0;
while(!t.done) {
if (!res[t.value]) {
let entry = Object.create(null);
entry.value = t.value;
entries[i++] = entry;
res[t.value] = true;
}
t = it.next();
}
}
this["[[Entries]]"] = entries;
}
get size() {
return Object.keys(this["[[Entries]]"]).length;
}
add(value) {
if (!this.has(value)) {
this["[[Entries]]"][this.size] = value;
}
return this;
}
clear() {
this["[[Entries]]"] = Object.create(null);
}
delete(value) {
const fItem = Object.entries(this["[[Entries]]"]).find(arr => arr[1] === value);
if (fItem) {
return delete this["[[Entries]]"][fItem[0]];
}
return false;
}
values() {
return new _SetIterator(this["[[Entries]]"]);
}
keys() {
return this.values()
}
entries() {
let start = 0;
return {
next() {
if (start++ < this.size) {
const v = this["[[Entries]]"][start].value;
return { value: [v, v], done: false }
}
return { value: undefined, done: true }
}
}
}
forEach(callback) {
Object.values(this["[[Entries]]"]).forEach(v => { callback(v, v, this) });
}
has(value) {
return Object.values(this["[[Entries]]"]).includes(value);
}
[Symbol.iterator]() {
return new _SetIterator(this["[[Entries]]"]);
}
}
测试效果图如下: