1. 程式人生 > 其它 >手寫set方法

手寫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; } } }