一起来用js实现一个Set-类

7次阅读

共计 2429 个字符,预计需要花费 7 分钟才能阅读完成。

基础知识:

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

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

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

创建集合

首先我们创建骨架如下:

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

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

  1. add(value) : 向集合添加一个新的值
  2. delete(value) : 删除集合中的一个值
  3. has(value) : 检测一个值是否在集合中 返回 true/false
  4. clear() : 清空集合
  5. size() : 返回集合的数量
  6. 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();

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

正文完
 0