一起来用js实现一个Set 类
基础知识:
集合是由一组无序且唯一(即不能重复)的项组成的。在数学中,集合是一组不同的对象(的集)。比如说,
一个由大于或等于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();
接下来我们来实现 交集 并集 差集 子集