手动实现es6的set集合 模拟set集合实现对应的功能

简介: 手动实现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)
相关文章
|
1月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
1月前
|
Java 程序员 C语言
赶快收藏!全网最佳Set集合详解:HashSet、TreeSet!
面试官:那TreeSet要怎么定制排序?TreeSet的自定义排序我们要利用Comparator接口,通过向TreeSet传入自定义排序规则的Comparator来实现。官方源码是这么解释的,南友们看一看。// 构造一个新的空树集,根据指定的比较器进行排序。// 插入到集合中的所有元素都必须能够通过指定的比较器相互比较: comparator. compare(e1, e2)不得对集合中的任何元素e1和e2抛出ClassCastException。
赶快收藏!全网最佳Set集合详解:HashSet、TreeSet!
|
1月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
29天前
|
索引 Python 容器
为什么Python中会有集合set类型?
为什么Python中会有集合set类型?
|
1月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
1月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。
|
1月前
|
存储 Java
java集合框架复习----(3)Set
这篇文章详细介绍了Java集合框架中的Set集合,包括HashSet和TreeSet的特点、实现原理和使用示例,展示了Set集合的无序性、元素唯一性以及如何通过自定义比较器实现元素的排序。
|
1月前
|
Python
python集合类型 (Set Types)
【8月更文挑战第3天】
57 9
|
1月前
|
存储 JavaScript 前端开发
ES6新特性(四): Set 和 Map
ES6新特性(四): Set 和 Map
|
1月前
|
Python
【Python 3】Set集合的解析与使用
文章介绍了Python中Set集合的用法,包括如何创建集合、添加和删除元素,以及如何进行元素计数和成员资格检查。
15 0