JavaScript字典与集合详解

作者:? 时间:2024-04-16 09:28:13 

字典

什么是字典

说到字典,第一时间想到的应该就是新华字典,实际上,这跟编程中的字典类似,两者都有一个特点,就是一一对应(yi yi dui ying),或者说是映射

字典通常以**【键,值】** 对的形成存储,因为是以键值对的形式存储,更方便通过key来获取value

比如存储用户信息:

{
 'username': '一碗周',
 'age': 18
}

JavaScript中的字典

在JavaScript中,对象好像拥有字典的所有特点,但是在ES6中新增Map,用来表示字典,这里的map不是翻译成地图,而是映射。

示例代码如下:

// 创建一个字典
const map = new Map()

// 往字典中存储信息
map.set('username', '一碗周')
map.set('age', 18)
console.log(map) // Map(2) { 'username' => '一碗周', 'age' => 18 }

字典的应用

在学习链表的时候我们做了一个算法题,是力扣中题号为20的一道题,它的题目:有效的括号,题目大意就是判断给定字符串中的括号是否匹配,匹配返回true,否则返回false

解题思路如下:

  • 判断字符串的长度是否为偶数,不为偶数直接返回false,因为括号都是成对出现的;

  • 新建一个栈;

  • 遍历字符串,遍历到每一项时如果时左括号,将其压入栈;如果是右括号,与栈顶对比,如果相匹配则出栈,不匹配则返回false

我们原来的解法:

/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
   if (s.length % 2 !== 0) return false
   const stack = []
   for(let i = 0; i<s.length; i++) {
       const c = s[i] // 记录当前项
       if (c === '(' || c === '[' || c==='{') {
           stack.push(c)
       } else {
           const t = stack[stack.length - 1] // 获取栈顶元素
           if (
               (t === '(' && c === ')') ||
               (t === '[' && c === ']') ||
               (t === '{' && c === '}')
           ) {
               stack.pop()
           } else {
               return false
           }
       }
   }
   // 如果为0表示全部匹配,有剩余则表示不匹配
   return stack.length === 0
};

在上面的代码中,条件判断中的判断条件非常的长,这时我们就可以利用字典来优化这个写法,

实现代码如下:

/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
   // 1. 判断字符串的长度是否为偶数,不为偶数直接返回false,因为括号都是成对出现的;
   if (s.length % 2 !== 0) return false
   const stack = []
   const map = new Map() // 将所有括号的对应关系存储在字典中
   map.set('(', ')')
   map.set('[', ']')
   map.set('{', '}')
   for(let i = 0; i<s.length; i++) {
       const c = s[i] // 记录当前项
       // 判断是否存在 key 也就是左括号,如果存储,将左括号存储在栈中
       if (map.has(c)) {
           stack.push(c)
       } else {
           const t = stack[stack.length - 1] // 获取栈顶元素
           if (map.get(t) === c) { // 获取最后一个左括号,判断是否与右括号匹配
               stack.pop() // 出栈
           } else {
               return false
           }
       }
   }
   // 如果为0表示全部匹配,有剩余则表示不匹配
   return stack.length === 0
};

在这个代码中,我们优化了if语句中的判断条件。

集合

什么是集合

集合是由一组无序且不重复的元素构成。我们可以将集合看成一种特殊的数组,它的特殊之处就是无序且不重复,这也就意味着我们不能通过下标的方式进行访问,而且集合中不会出现重复的元素;

JS中的集合

在JavaScript中提供了集合这个数据结构,即SetMDN中的描述如下:

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。Set中的元素只会出现一次,即Set中的元素是唯一的。

集合中的操作

在集合中主要有以下场景操作:

  • 添加元素到集合中;

  • 在集合中删除某元素;

  • 判断元素是否在集合中;

  • 清空集合;

  • 求交集、并集、差集;

除了最后一种Set对象就为我们提供了对应的方法,示例代码如下:

const arr = [1, 2, 3, 2, 3, 4, 5]
// 利用set实现去重
const set = new Set(arr) // [1, 2, 3, 4, 5]

// 往集合中添加元素
set.add(3) // [1, 2, 3, 4, 5] 添加失败,集合中不允许出现重复元素
set.add(6) // [1, 2, 3, 4, 5, 6]

// 判断元素是否在集合中
set.has(2) // true
set.has(7) // false

// 删除集合中的元素
set.delete(1) // [2, 3, 4, 5, 6]

// 清空集合
set.clear()

交集、并集、差集的封装

首先我们需要了解一下什么交集、并集、差集。

  • 并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合

  • 交集:对于给定的两个集合,返回一个包含两个集合中共有元素的新集合

  • 差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合

下面这个图更好的解释了什么是交集、并集、差集。

JavaScript字典与集合详解

封装代码如下:

// 求两个集合的并集
export function union(setA, setB) {
 let _union = new Set(setA)
 for (let elem of setB) {
   _union.add(elem) // 因为集合中不存在重复元素
 }
 return _union
}

// 求两个集合的交集
export function intersection(setA, setB) {
 let _intersection = new Set()
 for (let elem of setB) {
   if (setA.has(elem)) {
     _intersection.add(elem)
   }
 }
 return _intersection
}
// 求两个集合的差集
export function difference(setA, setB) {
 let _difference = new Set(setA)
 for (let elem of setB) {
   _difference.delete(elem)
 }
 return _difference
}

封装的这三个方法全部利用了集合不能重复的特性。

来源:https://juejin.cn/post/7108007381950267399

标签:JavaScript,字典,集合
0
投稿

猜你喜欢

  • SpringBoot使用flyway初始化数据库

    2024-01-28 13:43:38
  • python实现下载整个ftp目录的方法

    2023-01-31 01:45:17
  • 详解如何使用Python实现删除重复文件

    2022-08-14 04:33:54
  • 用Vue Demi同时支持Vue2和Vue3的方法

    2024-05-13 09:38:35
  • MySQL学习笔记小结

    2024-01-26 22:20:33
  • Pyecharts 中Geo函数常用参数的用法说明

    2022-06-07 08:35:06
  • vue项目打包优化的方法实战记录

    2024-04-26 17:39:50
  • js DOM模型操作

    2024-05-13 09:37:18
  • linux mysql 报错:MYSQL:The server quit without updating PID file

    2024-01-22 08:40:47
  • php设置允许大文件上传示例代码

    2024-05-09 14:47:46
  • python pygame实现挡板弹球游戏

    2022-11-25 17:50:42
  • Python运算符重载的简单实例代码

    2021-02-13 11:21:22
  • python使用pip安装SciPy、SymPy、matplotlib教程

    2022-03-05 01:46:12
  • pytorch 实现cross entropy损失函数计算方式

    2022-03-18 00:45:50
  • Python图像增强imgaug详解

    2022-02-07 17:07:40
  • 如何取得刚添加的记录自动增加的ID?

    2010-01-18 20:55:00
  • 对Python生成汉字字库文字,以及转换为文字图片的实例详解

    2021-12-10 16:55:51
  • python妙用之编码的转换详解

    2022-01-29 05:01:54
  • SQL2000中的默认sa帐号的修改与删除方法

    2024-01-22 22:54:59
  • Entity Framework使用Code First模式管理数据库

    2024-01-28 04:40:43
  • asp之家 网络编程 m.aspxhome.com