JavaScript字典与集合详解

 更新时间:2022年07月13日 15:11:28   作者:​ 一碗周​  
这篇文章主要介绍了JavaScript字典与集合详解,集合是由一组无序且不重复的元素构成。我们可以将集合看成一种特殊的数组,它的特殊之处就是无序且不重复,这也就意味着我们不能通过下标的方式进行访问,而且集合中不会出现重复的元素

字典

什么是字典

说到字典,第一时间想到的应该就是新华字典,实际上,这跟编程中的字典类似,两者都有一个特点,就是一一对应(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()

交集、并集、差集的封装

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

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

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

封装代码如下:

// 求两个集合的并集
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
}

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

到此这篇关于JavaScript字典与集合详解的文章就介绍到这了,更多相关JS字典与集合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ng-options和ng-checked在表单中的高级运用(推荐)

    ng-options和ng-checked在表单中的高级运用(推荐)

    AngularJS是当前非常的流行的前端框架,它的语法糖非常多,也极大的方便了前端开发者。这篇文章主要介绍了ng-options和ng-checked在表单中的高级运用,需要的朋友可以参考下
    2017-01-01
  • 低代码从0到1创建小程序项目详解流程

    低代码从0到1创建小程序项目详解流程

    低代码作为开发工具类的产品,需要有从0到1体系化的教程才可以,而且还得有教师进行辅助。否则,学习低代码是有难度的,入门很难。因为大家习惯了用代码编程,一下子过度到可视化编程,有一个思路上的转变
    2022-08-08
  • 前端js中的事件循环eventloop机制详解

    前端js中的事件循环eventloop机制详解

    这篇文章主要给大家介绍了关于前端js中事件循环eventloop机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用js具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 用js实现的抽象CSS圆角效果!!

    用js实现的抽象CSS圆角效果!!

    用js实现的抽象CSS圆角效果!!...
    2007-05-05
  • js汉字转拼音实现代码

    js汉字转拼音实现代码

    汉字转拼音,比较娱乐的一款应用,感兴趣的朋友可以了解下,或许对你学习js有所帮助
    2013-02-02
  • jQuery获取随机颜色的实例代码

    jQuery获取随机颜色的实例代码

    这篇文章主要介绍了jQuery获取随机颜色的实例代码,非常不错,具有一定的参考借鉴价值,感兴趣的朋友跟随脚本之家小编来学习吧
    2018-05-05
  • 登陆成功后自动计算秒数执行跳转

    登陆成功后自动计算秒数执行跳转

    本文实现的是这样的一个功能登陆成功后自动查秒跳转,具体示例如下,不了解的朋友可以学习下哦
    2014-01-01
  • 一个简易时钟效果js实现代码

    一个简易时钟效果js实现代码

    这篇文章主要为大家详细介绍了一个简易时钟效果js实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 使用layui实现树形结构的方法

    使用layui实现树形结构的方法

    今天小编就为大家分享一篇使用layui实现树形结构的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • javaScript动态添加Li元素的实例

    javaScript动态添加Li元素的实例

    下面小编就为大家分享一篇javaScript动态添加Li元素的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02

最新评论