JavaScript实现集合与字典

一、集合结构

1.1.简介

集合比较常见的实现方式是哈希表,这里使用JavaScript的Object类进行封装。

集合通常是由一组无序的不能重复的元素构成。

  • 数学中常指的集合中的元素是可以重复的,但是计算机中集合的元素不能重复。

集合是特殊的数组:

  • 特殊之处在于里面的元素没有顺序也不能重复
  • 没有顺序意味着不能通过下标值进行访问,不能重复意味着相同的对象在集合中只会存在一份

实现集合类

  • 在ES6中的Set类就是一个集合类,这里我们重新封装一个Set类,了解集合的底层实现。

  • JavaScript中的Object类中的key就是一个集合,可以使用它来封装集合类Set。

集合常见的操作

  • add(value):向集合添加一个新的项;

  • remove(value):从集合中移除一个值;

  • has(value):如果值在集合中,返回true,否则返回false

  • clear():移除集合中的所有项;

  • size():返回集合所包含元素的数量,与数组的length属性相似;

  • values():返回一个包含集合中所有值的数组;

还有其他的方法,用的不多这里不做封装;

1.2.代码实现

    //封装集合类
function Set() {
//属性
this.items = {} //方法
//一.has方法
Set.prototype.has = value => {
return this.items.hasOwnProperty(value)
} //二.add方法
Set.prototype.add = value => {
//判断集合中是否已经包含该元素
if (this.has(value)) {
return false
}
//将元素添加到集合中
this.items[value] = value//表示该属性键和值都为value
return true//表示添加成功
} //三.remove方法
Set.prototype.remove = (value) => {
//1.判断集合中是否包含该元素
if (!this.has(value)) {
return false
} //2.将元素从属性中删除
delete this.items[value]
return true
} //四.clear方法
Set.prototype.clear = () => {
//原来的对象没有引用指向,会被自动回收
this.items = {}
} //五.size方法
Set.prototype.size = () => {
return Object.keys(this.items).length
} //获取集合中所有的值
//六.values方法
Set.prototype.values = function() {
return Object.keys(this.items)
}
}

测试代码:

    //测试集合类
//1.创建Set类对象
let set = new Set() //添加元素
//2.测试add方法
console.log(set.add('a')); //67
console.log(set.add('a')); //68
console.log(set.add('b')); //69
console.log(set.add('c')); //70
console.log(set.add('d')); //71 //3.测试values方法
console.log(set.values()); //74 //删除元素
//4.测试remove方法
console.log(set.remove('a')); //78
console.log(set.remove('a')); //79
console.log(set.values()); //80 //5.测试has方法
console.log(set.has('b')); //83 //6.测试size方法和clear方法
console.log(set.size()); //86
set.clear()
// 由于clear方法的实现原理为指向另外一个空对象,所以不影响原来的对象
console.log(set.size()); //89
console.log(set.values()); //90

测试结果:

1.3.集合间的操作

集合间操作:

  • 并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合;
  • 交集:对于给定的两个集合,返回一个包含两个集合中共有元素的新集合;
  • 差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合;
  • 子集:验证一个给定集合是否是另一个集合的子集;

并集的实现:

实现思路:创建集合C代表集合A和集合B的并集,先将集合A中的所有元素添加到集合C中,再遍历集合B,如果是集合C所没有的元素就把它添加到集合C中。

 Set.prototype.union = otherSet => {
// this:集合对象A
// otherSet:集合对象B
//1.创建一个新的集合
let unionSet = new Set() //2.将A集合中的所有元素添加到新集合中
let values = this.values()
// for(let i of values){
// unionSet.add(i)
// }
for(let i = 0;i < values.length;i++){
unionSet.add(values[i])
} //3.取出B集合中的元素,判断是否需要加到新集合中
values = otherSet.values()
// for(let i of values){
// //由于集合的add方法已经对重复的元素进行了判断,所以这里可以直接添加
// unionSet.add(i)
// }
for(let i = 0;i < values.length;i++){
unionSet.add(values[i])
}
return unionSet
}

交集的实现:

实现思路:遍历集合A,当取得的元素也存在于集合B时,就把该元素添加到另一个集合C中。

 Set.prototype.intersection = otherSet => {
// this:集合A
// otherSet:集合B
//1.创建新的集合
let intersectionSet = new Set() //2.从A中取出一个元素,判断是否同时存在于集合B中,是则放入新集合中
let values = this.values()
for(let i =0 ; i < values.length; i++){
let item = values[i]
if (otherSet.has(item)) {
intersectionSet.add(item)
}
}
return intersectionSet
}

差集的实现:

实现思路:遍历集合A,当取得的元素不存在于集合B时,就把该元素添加到另一个集合C中。

Set.prototype.diffrence = otherSet => {
//this:集合A
//otherSet:集合B
//1.创建新的集合
var diffrenceSet = new Set() //2.取出A集合中的每一个元素,判断是否同时存在于B中,不存在则添加到新集合中
var values = this.values()
for(var i = 0;i < values.length; i++){
var item = values[i]
if (!otherSet.has(item)) {
diffrenceSet.add(item)
}
}
return diffrenceSet
}

子集的实现:

实现思路:遍历集合A,当取得的元素中有一个不存在于集合B时,就说明集合A不是集合B的子集,返回false。

 Set.prototype.subset = otherSet => {
//this:集合A
//otherSet:集合B
//遍历集合A中的所有元素,如果发现,集合A中的元素,在集合B中不存在,那么放回false,如果遍历完整个集合A没有返回false,就返回true
let values = this.values()
for(let i = 0; i < values.length; i++){
let item = values[i]
if(!otherSet.has(item)){
return false
}
}
return true
}

二、字典结构

2.1.简介

字典的特点

  • 字典存储的是键值对,主要特点是一一对应;
  • 比如保存一个人的信息:数组形式:[19,‘Tom’,1.65],可通过下标值取出信息;字典形式:{"age":19,"name":"Tom","height":165},可以通过key取出value。
  • 此外,在字典中key不能重复无序的,而Value可以重复

字典和映射的关系

  • 有些编程语言中称这种映射关系字典,如Swift中的Dictonary,Python中的dict;
  • 有些编程语言中称这种映射关系Map,比如Java中的HashMap&TreeMap等;

字典类常见的操作

  • set(key,value):向字典中添加新元素。
  • remove(key):通过使用键值来从字典中移除键值对应的数据值。
  • has(key):如果某个键值存在于这个字典中,则返回true,反之则返回false
  • get(key):通过键值查找特定的数值并返回。
  • clear():将这个字典中的所有元素全部删除。
  • size():返回字典所包含元素的数量。与数组的length属性类似。
  • keys():将字典所包含的所有键名以数组形式返回。
  • values():将字典所包含的所有数值以数组形式返回。

2.2.封装字典

字典类可以基于JavaScript中的对象结构来实现,比较简单,这里直接实现字典类中的常用方法。

//封装字典类
function Dictionary(){
//字典属性
this.items = {} //字典操作方法
//一.在字典中添加键值对
Dictionary.prototype.set = function(key, value){
this.items[key] = value
} //二.判断字典中是否有某个key
Dictionary.prototype.has = function(key){
return this.items.hasOwnProperty(key)
} //三.从字典中移除元素
Dictionary.prototype.remove = function(key){
//1.判断字典中是否有这个key
if(!this.has(key)) return false //2.从字典中删除key
delete this.items[key]
return true
} //四.根据key获取value
Dictionary.prototype.get = function(key){
return this.has(key) ? this.items[key] : undefined
} //五.获取所有keys
Dictionary.prototype.keys = function(){
return Object.keys(this.items)
} //六.size方法
Dictionary.prototype.keys = function(){
return this.keys().length
} //七.clear方法
Dictionary.prototype.clear = function(){
this.items = {}
}
}

参考资料:JavaScript数据结构与算法

JavaScript实现集合与字典的更多相关文章

  1. JavaScript数据结构——集合、字典和散列表

    集合.字典和散列表都可以存储不重复的值. 在集合中,我们感兴趣的是每个值本身,并把它当作主要元素.在字典和散列表中,我们用 [键,值] 的形式来存储数据. 集合(Set 类):[值,值]对,是一组由无 ...

  2. 使用JavaScriptSerializer序列化集合、字典、数组、DataTable为JSON字符串 分类: 前端 数据格式 JSON 2014-10-30 14:08 169人阅读 评论(0) 收藏

    一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大 ...

  3. python集合与字典的用法

    python集合与字典的用法 集合: 1.增加  add 2.删除   •del 删除集合 •discard(常用)删除集合中的元素  #删除一个不存在的元素不会报错 •remove 删除一个不存在的 ...

  4. 列表 list 容器类型数据(str字符串, list列表, tuple元组, set集合, dict字典)--->元组 tuple-->字符串 str

    # ### 列表 list 容器类型数据(str字符串, list列表, tuple元组, set集合, dict字典) # (1)定义一个列表 listvar = [] print(listvar, ...

  5. 5--Python入门--Python数据集合类型--字典

    列表list,最常用的数据类型,以[]为标识 元组tuple,和list很相似,但是不能二次赋值,用()标识 集合set,和list类似,但是set中没有重复的元素,常用于集合间的运算,用{}标识 字 ...

  6. Python 基础补充(一) 列表、元组、集合、字典的区别和相互转换

    一.列表.元组.集合.字典的区别   列表 元组 集合 字典 英文 list tuple set dict 可否读写 读写 只读 读写 读写 可否重复 是 是 否 是 存储方式 值 值 键(不能重复) ...

  7. JavaScript常见集合操作

    JavaScript常见集合操作 集合的遍历 FOR循环(效率最高) 优点:JavaScript最普遍的for循环,执行效率最高 缺点:无法遍历对象 for(let i=0;i<array.le ...

  8. [Swift]遍历集合类型(数组、集合和字典)

    Swift提供了三种主要的集合类型,称为数组,集合和字典,用于存储值集合. 数组是有序的值集合. 集是唯一值的无序集合. 字典是键值关联的无序集合. Swift中无法再使用传统形式的for循环. // ...

  9. JavaScript数据结构与算法-字典练习

    字典的实现 // 字典类 function Dictionary () { this.add = add; this.dataStore = new Array(); this.find = find ...

随机推荐

  1. Learn Git Lesson06 - 分离头指针

    ============== 知识点 分离头指针 HEAD 含义 git diff 分离头指针 (Detached HEAD) 有时候想尝试性修改某些内容(实验),也许并不会真的提交到分支,这时候可以 ...

  2. 3)Framework创建思路

  3. 吴裕雄--天生自然 HADOOP大数据分布式处理:使用XShell远程连接主机与服务器并配置它们之间SSH免密登录

  4. servlet之间传递数据的方式

    Servlet传递数据方式 基本概述 Servlet传递数据的方式有很多,这里提供五种方式: 1.静态变量 2.HttpServletResponse的sendRedirect()方法 3.HttpS ...

  5. 学习python-20191203-Python Flask高级编程开发鱼书_第02章 Flask的基本原理与核心知识

    视频01: 做一个产品时,一定要对自己的产品有一个明确的定位.并可以用一句话来概括自己产品的核心价值或功能. 鱼书网站几个功能 1.选择要赠送的书籍,向他人赠送书籍(价值功能,核心价值的主线): 2. ...

  6. Java包装类之实体类不要使用基本类型

    [color=rgba(0, 0, 0, 0.75)]今天来记录一下,在项目中因为基本类型,所产生的bug.**U•ェ•*U** 包装类:8种基本类型的包装类 应用场景:数据库建立实体映射多用包装类 ...

  7. JSP_EL的回顾

    在 JSP 页面中,使用标签库代替传统的 Java 片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现.鉴于此,出现了 JSTL ( JSP Standa ...

  8. 反编译.net下的exe程序

    1. 什么叫.net平台 .NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境..NET框架的目的是便于开发人员更容易地建立Web应用程序和Web服务,使得Internet上的 ...

  9. MOOC(3)- python发送请求,返回的json数据被转码

    https://www.cnblogs.com/yoyoketang/p/10339210.html 问题:发送post请求,对post请求返回的json数据格式化,但是返回的结果被转码了 json. ...

  10. 应对百万访问量的epoll模式

    写在前面 select/poll与epoll select/poll模型工作机理 select/poll模型的局限 epoll模型工作机理 epoll的局限 golang中的epoll golang源 ...