资讯专栏INFORMATION COLUMN

一起来用js实现一个Set 类

ChanceWong / 493人阅读

摘要:基础知识集合是由一组无序且唯一即不能重复的项组成的。还有一个概念叫空集。接下来我们实现对应的方法向集合添加一个新的值删除集合中的一个值检测一个值是否在集合中返回清空集合返回集合的数量返回一个包含所有值的数组方法实现首先要实现的是方法。

基础知识:

集合是由一组无序且唯一(即不能重复)的项组成的。在数学中,集合是一组不同的对象(的集)。比如说,

一个由大于或等于0的整数组成的自然数集合:N= {0, 1, 2, 3, 4, 5, 6, …}。

集合中的对象列表用“{}”(大括号)包围。还有一个概念叫空集。空集就是不包含任何元素的集合。比如24和29之间的素数集合。由于24和29之间没有素数(除了1和自身,没有其他正因数的大于1的自然数),这个集合就是空集。空集用“{ }”表示。你也可以把集合想象成一个既没有重复元素,也没有顺序概念的数组。在数学中,集合也有并集、交集、差集等基本操。

创建集合

首先我们创建骨架如下:

class Set{
    constructor(){
        this.items={}
    }
}

这里也可以用数组来保存,JS对象具有不允许一个键指向两个不同的属性,保证了集合里的元素都是唯一的。
接下来我们实现对应的方法:

add(value) :向集合添加一个新的值

delete(value) : 删除集合中的一个值

has(value) : 检测一个值是否在集合中 返回 true/false

clear() :清空集合

size() : 返回集合的数量

values() : 返回一个包含所有值的数组

has() 方法实现

首先要实现的是has(value)方法。这是因为它会被add、remove等其他方法调用。如下:

class Set{
    constructor(){
        this.items={}
    }

    has(val){
        // return val in this.items;
        return this.items.hasOwnProperty(val)
    }
}

let setDemo=new Set();
//false
console.log(setDemo.has("demo"))
add() 方法
class Set{
    constructor(){
        this.items={}
    }

    has(val){
        // return val in this.items;  
        return this.items.hasOwnProperty(val)
    }
    
    add(val){
        if(!this.has(val)){
            this.items[val]=val;
            return true;
        }else{
            return false;
        }
    }
}

let setDemo=new Set();
setDemo.add("demo");
// true
console.log(setDemo.has("demo"))
remove 与 clear

用对象来存储集合的items对象,就可以简单地使用delete操作符从items对象中移除属性

class Set{
    constructor(){
        this.items={}
    }

    has(val){
        // return val in this.items;  
        return this.items.hasOwnProperty(val)
    }
    
    add(val){
        if(!this.has(val)){
            this.items[val]=val;
        }
    }

    remove(val){
        if(this.has(val)){
            delete this.items[val];
        }
    }

    clear(){
        this.items = {};
    }
}

let setDemo=new Set();
setDemo.add("demo");
setDemo.add("demo1");
setDemo.add("demo2");

console.log(setDemo.has("demo"))
setDemo.remove("demo");
console.log(setDemo.has("demo"))
console.log(setDemo)
setDemo.clear();
console.log(setDemo)


clear效果

size() 方法
class Set{
    constructor(){
        this.items={}
    }

    has(val){
        // return val in this.items;  
        return this.items.hasOwnProperty(val)
    }
    
    add(val){
        if(!this.has(val)){
            this.items[val]=val;
        }
    }

    remove(val){
        if(this.has(val)){
            delete this.items[val];
        }
    }

    clear(){
        this.items = {};
    }

    size(){

        return Object.keys(this.items).length;
    }
}

let setDemo=new Set();
setDemo.add("demo");
setDemo.add("demo1");
setDemo.add("demo2");
setDemo.size()

values() 方法
class Set{
    constructor(){
        this.items={}
    }

    has(val){
        // return val in this.items;  
        return this.items.hasOwnProperty(val)
    }
    
    add(val){
        if(!this.has(val)){
            this.items[val]=val;
        }
    }

    remove(val){
        if(this.has(val)){
            delete this.items[val];
        }
    }

    clear(){
        this.items = {};
    }

    size(){

        return Object.keys(this.items).length;
    }

    values(){
        let arr=[];
        Object.keys(this.items).forEach(item=>{
            arr.push(this.items[item]);
        })
        return arr;
    }
}

let setDemo=new Set();
setDemo.add("demo");
setDemo.add("demo1");
setDemo.add("demo2");
setDemo.size();
setDemo.values();

接下来我们来实现 交集 并集 差集 子集

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104012.html

相关文章

  • 实现 Vue 的 MVVM 框架

    摘要:原文地址一个框架一个响应式的组件系统,通过把页面抽象成一个个组件来增加复用性降低复杂性主要特色就是数据操纵视图变化,一旦数据变化自动更新所有关联组件所以它的一大特性就是一个数据响应系统,当然有了数据还需要一个模板解析系统即帮我们把数据模板生 原文地址:https://gmiam.com/post/evo.html Vue 一个 MVVM 框架、一个响应式的组件系统,通过把页面抽象成一个...

    BaronZhang 评论0 收藏0
  • CQRS框架(nodejs的DDD开发落地框架)初识感想

    摘要:中的事件的一个,我暂且理解为一个中的和这两个属性已经在框架中直接挂载在了对象上,归功于曾老师。 CQRS是啥?DDD又是啥? 这两个概念其实没什么神秘的,当然此文章中的这两个概念以曾老师的课程为准(关于CQRS和DDD的标准概念,google上已经很多了,不再赘述。) DDD(Domain Driven Design),领域驱动设计开发。 DDD和OOP有什么同吗?其实就我个人经验来说...

    zhoutk 评论0 收藏0
  • 从零到有模拟实现Set

    摘要:过滤掉和简单判断是否是迭代器对象模拟行为对迭代器对象进行遍历操作。看到这里你可能已经知道了,要实现的功能之一就是提供一个迭代器。原文链接参考迭代器和生成器系列之模拟实现一个数据结构展开语法循环 前言 es6新增了Set数据结构,它允许你存储任何类型的唯一值,无论是原始值还是对象引用。这篇文章希望通过模拟实现一个Set来增加对它的理解。 原文链接 用在前面 实际工作和学习过程中,你可能也...

    PAMPANG 评论0 收藏0

发表评论

0条评论

ChanceWong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<