手写set方法

一、手写set方法

  1.HTML

<script src="./01.js"></script>
    <script>
        //set方法里面参数为可迭代对象(set集合、map集合、数组、伪数组)
        const s = new MySet([1,2,3])
        //判断数据是否存在
        // console.log(s.has(1))//true

        //add()添加数据,同一个数据添加无效,返回值为新的数组
        s.add(5)

        //获取数组长度
        console.log(s.size);

        //forEach方法,item === i,s是new MySet对象
        s.forEach((item,i,s) => {
            console.log(item,i,s)
        });

        const iter = s[Symbol.iterator]()
        console.log(iter)//generator
        //生成器对象是由一个generator function返回的 
    </script>

  

  2. 01.js

 

class MySet{
    //Symbol.iterator 为每个对象定义了默认的迭代器。
    //该迭代器可以被for... of循环使用
    constructor(iterator = []){
        //传递的对象必须是一个可迭代对象
        //所以需要判断传递的参数是否是可迭代对象
        if(typeof iterator[Symbol.iterator] !== "function"){
            //不是可迭代对象就抛出一个错误
            throw new TypeError(`您所提供的${iterator}不是一个可迭代对象`)
        }
        //创建一个空数组
        this._datas = [];
        //取出数组iterator里面的值,用for of循环
        for (const item of iterator) {
            // 将值添加到空数组中
            this.add(item)
        }
    }
    
    //判断两个值是否相等
    isEqual(data1,data2){
        //1.存在两个都为0的情况
        if(data1 === 0 && data2 === 0){
            return true;
        }
        //2.Object.is()方法判断两个值是否为同一个值
        return Object.is(data1,data2)
    }

    //判断数据是否存在数组中
    has(data){
        //遍历数组中的值(用for of)
        for (const item of this._datas) {
            //调用isEqual()方法判断 data(输入的数据)跟item(数组中的数据)
            if(this.isEqual(data,item)){
                //相同返回true
                return true;
            }
            //不相同返回false
            return false;
        } 
    }

    //添加数据的方法
    add(data){
        //首先判断添加的值是否存在在当前数组中,存在的话就默认返回undefined,
        //不存在就把数据添加到之前定义的空数组中,
        // 此时已经不是空数组,而是存入了item值
        if(!this.has(data)){
            //不存在就添加到数组中
            this._datas.push(data)
        }
        return this._datas
    }

    // 删除数据,返回结果true/false,删除成功/删除失败
    delete(data){
        //遍历数组中的数据,i为下标,element为每个数据
        for(let i = 0;i < this._datas.length;i++){
            const element = this._datas[i];
            //判断data跟element是否相同,相同说明数组中存在数据,可以删除
            if(this.isEqual(data,element)){
               //删除数据利用slice()方法
               this._datas.slice(i,1)
               //删除成功
               return true;
            }
        }
        //删除失败
        return false;
    }

    //清除数据
    clear(){
        //数组长度为0
        this._datas.length = 0
        return this._datas
    }

    //获取数组长度
    get size(){
        return this._datas.length;
    }

    //forEach方法(里层用for of)
    forEach(callback){
        for (const item of this._datas) {
            callback(item,item,this)
        }
    }

    //*[Sysbol.iterator]
    *[Symbol.iterator](){
        for (const item of this._datas) {
            yield item;
        }
    }
}

 

posted @ 2021-10-19 19:57  12345上山打老虎1  阅读(191)  评论(0)    收藏  举报