手動實現es6的set集合 模擬set集合實現對應的功能

 // 底層實現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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章