// 底層實現set, 手寫實現set, 爲了更加深刻的理解set集合
class MySet {
// 此處定義一個數組來模擬set, 原生的set是用c或者c++ 可以操作瀏覽器底層的設計
_datas = Symbol("內部維護一個數組來模擬set")
// 這裏用戶可以傳入參數,也可以不傳遞參數
constructor(iterator = []) {
if (typeof iterator[Symbol.iterator] !== "function") {
// 判斷傳入的參數是否是一個可迭代的對象, 因爲可迭代對象裏面一定有一個知名符號的函數
return new Error(`你傳入的${iterator}不是以惡可迭代對象`);
}
this._datas = [];
// 傳入的是一個迭代對象,那麼進行遍歷,放入MySet 的數組裏面
for (const item of iterator) {
// 添加到數組裏面
this.add(item);
}
}
/**
* @description: 往set 裏面添加一個數據
* @param : 添加的數據
* @return: {boolean} 結果
*/
add(data) {
// 添加一個數據,要判斷set裏面是否已經存在該數據了
if (!this.has(data)) {
this._datas.push(data);
return this._datas;
}
return this._datas;
}
/**
* @description: 判斷set集合內部裏面是否存在某個元素
* @param : data 數據
* @return: {boolean} 結果
*/
has(data) {
for (const item of this._datas) {
if (this.isEqual(data, item)) {
return true;
}
}
return false;
}
/**
* @description: 判斷兩個數據是否相同
* @param : data1 數據1
* @param : data2 數據2
* @return: {boolean}
*/
isEqual(data1, data2) {
// 因爲set 內部+0 和 -0 是經過特殊測合理的,所以此處這樣老模擬
if (data1 === 0 && data2 === 0) {
return true;
}
// 如果比較的兩個值不是0,則使用Oject.is
return Object.is(data1, data2)
}
/**
* @description: 刪除set裏面的某個值
* @param : data
* @return: boolean 結果
*/
delete(data) {
for (let i = 0; i < this._datas.length; i++) {
const element = this._datas[i];
if (this.has(data)) {
this._datas.splice(i, 1);
return true;
} else {
return false;
}
}
}
/**
* @description: 清空set
*/
clear() {
this._datas.length = 0;
return this._datas;
}
/**
* @description: 因爲set本身也是一個可迭代的對象,生成器來構建一個迭代對象,
使用方法: 直接調用該生成器方法,就可以創建一個可迭代的對象
*/
*[Symbol.iterator]() {
for (const item of this._datas) {
yield item;
}
}
/**
* @description: 爲了實現set 的forEach() 方法,
注意forEach() 第一二參數和第二個參數是一樣的,因爲set集合不存在下標
* @param :
* @return:
*/
forEach(callback) {
for (const item of this._datas) {
callback(item, item, this._datas);
}
}
// 獲取size的長度
get size(){
return this._datas.length;
}
}
// 使用方法,和set 的使用方法一樣
const arr = [1, 2, 3, 4, 1, 2, 3, 4];
const ms = new MySet(arr);
console.log(ms)
手動實現es6的set集合 模擬set集合實現對應的功能
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.