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

浙公网安备 33010602011771号