JS 数据结构:集合
创始人
2024-02-16 08:58:35

集合

集合是由一组无序且唯一(即不能重复)的项组成的。该数据结构使用了与有限集合相同的数学概念。ES6 JS 原生实现了集合 Set 数据结构(具体看这篇文章JS Set 与 weakSet),但是没有取两集合交集、并集、差集的 API ,所以本篇博客就自己实现一个集合并实现原生集合未实现的操作。

集合 API

定义集合

这里底层我们使用对象(使用数组也可以),使用对象的原因是为了更好的模拟 Set 的行为。

class MySet {constructor() {this.items = {};}
}

检验某个元素是否存在于集合中

因为是对象,所以我们可以使用 in 运算符,in 运算符会返回某个属性是否在对象及其原型链上,存在返回 true,否则返回 false。

// 检验某个元素是否存在于集合中has(item) {return item in this.items;}

添加、删除、清空

添加:因为集合内元素唯一,所以新增元素前需要先判断集合中是否由该元素。
删除:依然需要先判断集合中是否由该元素,有才能删除。
清空:因底层使用对象,所以清空直赋值空对象就好了。

// 添加元素add(item) {if (!this.has(item)) {this.items[item] = item;return true;}return false;}// 删除元素delete(item) {if (!this.has(item)) {delete this.items[item];return true;}return false;}// 清空集合clear() {this.items = {};}

获取集合元素的数量

我们使用for in便利对象的属性,但是由于for in会遍历所有的可迭代对象(包括原型链上的),所以需要使用hasOwnProperty方法判断一下当前属性是否是对象本身的属性。size 方法中是 count 才加一,最后返回 count 就是元素的数量了。values 方法中是才将当前属性值添加到结果数组中。

// 获取集合元素的数量size() {let count = 0;for (let key in this.items) { // {2} if (this.items.hasOwnProperty(key)) { // {3} count++; // {4} }return count;};}// 以数组的形式返回所有元素values() {let values = [];for (let key in this.items) { // {1} if (this.items.hasOwnProperty(key)) {values.push(key); // {2} }}return values;};

并集

两集合并集

给定的两个集合,返回一个包含两个集合中所有元素的新集合。
在这里插入图片描述

// 并集union(set) {const resSet = new Set();this.values().forEach(value => resSet.add(value));set.values().forEach(value => resSet.add(value));return resSet;}

多集合并集

给定的多个集合,返回一个包含所有集合中所有元素的新集合。

//多集合并集unionMany(...sets) {const resSet = new Set();this.values().forEach(value => resSet.add(value));sets.forEach(set => {set.values().forEach(value => resSet.add(value));})return resSet;}

交集

两集合交集

给定的两个集合,返回一个包含两个集合中共有元素的新集合。
在这里插入图片描述

 // 交集intersection(set) {const resSet = new Set();const values = this.values();for (let i = 0; i < values.length; i++) {if (set.has(values[i])) {resSet.add(values[i]);}}return resSet;}

多集合交集

给定的多个集合,返回一个包含所有集合中共有元素的新集合。

// 多集合交集intersection(...sets) {const resSet = new Set();const values = this.values();for (let i = 0; i < values.length; i++) {resSet.add(values[i]);}for (let i = 0; i < values.length; i++) {for (let set of sets) {if (!set.has(values[i])) {resSet.delete(values[i]);}}}return resSet;}

差集

给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。
在这里插入图片描述

// 差集difference(set) {const resSet = new Set();this.values().forEach(value => {if (!set.has(value)) {resSet.add(value);}});return resSet;}

判断是否子集

验证一个给定集合是否是另一集合的子集。给定集合的所有元素都能在另一个集合中找到。

  // 子集// 子集isSubsetOf(set) {if (this.size() > set.size()) {return false;}let isSubset = true;this.values().every(value => {if (!set.has(value)) {isSubset = false;return false;}return true;});return isSubset;}
}

集合的操作就这么多了,我是孤城浪人,一名正在前端路上摸爬滚打的菜鸟,欢迎你的关注。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...