手动实现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)
相关文章
|
2月前
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
38 5
|
2月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
42 6
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
33 2
|
22天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
22天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
22天前
|
Java 开发者
|
2月前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
36 4
|
2月前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
27 5
|
2月前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
27 2
|
2月前
|
存储 算法 Java
Java的Set集合以其严格的“不重复性”著称,使开发者既好奇又困惑
Java的Set集合以其严格的“不重复性”著称,使开发者既好奇又困惑。本文将探讨Set为何如此“挑剔”。Set接口不包含重复元素,适用于需要唯一性约束的场景。其内部通过哈希表或红黑树等数据结构和哈希算法、equals()方法来确保元素的唯一性。示例代码展示了Set如何自动过滤重复元素,体现了其高效性和便利性。
37 2