资讯专栏INFORMATION COLUMN

JavaScript字典与集合详解

3403771864 / 538人阅读

  今天和大家讲讲JS“字典”。所谓的JS“字典”其实和显示中常用汉语字典不一样,编程中的字典类似,两者都有一个特点,就是一一对应(yi yi dui ying),或者说是映射

  日常中的字典通常以**【键,值】** 对的形成存储,主要是由于以键值对的形式存储,这样的话更有利于可以通过key来获取value

  比如存储用户信息:

</>复制代码

  1.   {
  2.   'username''一碗周',
  3.   'age'18
  4.   }
  5.   JavaScript中的字典

  在JS的字典,其实就是在ES6中新增Map,并非字典,且map不是翻译成地图,而是映射。

  示例代码如下:

</>复制代码

  1.   // 创建一个字典
  2.   const map = new Map()
  3.   // 往字典中存储信息
  4.   map.set('username''一碗周')
  5.   map.set('age'18)
  6.   console.log(map) // Map(2) { 'username' => '一碗周''age' => 18 }

  字典的应用实例

  我们想要将一个算法题:有效的括号,内容就是判断给定字符串中的括号是否匹配,匹配返回true,否则返回false。

  解题思路如下:

  对字符串是否为偶数要做判断,当不是欧数值时返回false,依据是括号都是成对出现的;

  新建一个栈;

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

  我们原来的解法:

</>复制代码

  1.   /**
  2.   * @param {strings
  3.   * @return {boolean}
  4.   */
  5.   var isValid = function(s{
  6.   if (s.length % 2 !== 0return false
  7.   const stack = []
  8.   for(let i = 0; i<s.length; i++) {
  9.   const c = s[i] // 记录当前项
  10.   if (c === '(' || c === '[' || c==='{') {
  11.   stack.push(c)
  12.   } else {
  13.   const t = stack[stack.length - 1// 获取栈顶元素
  14.   if (
  15.   (t === '(' && c === ')'||
  16.   (t === '[' && c === ']'||
  17.   (t === '{' && c === '}')
  18.   ) {
  19.   stack.pop()
  20.   } else {
  21.   return false
  22.   }
  23.   }
  24.   }
  25.   // 如果为0表示全部匹配,有剩余则表示不匹配
  26.   return stack.length === 0
  27.   };

  上面代码中判断条实太长了,我们需要用字典这个方式来优化对应写法,

  实现代码如下:

</>复制代码

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

  上面代码主要是优化if条件判断语句。

  集合  

  集合是由一组无序且不重复的元素构成。集合就是无序且不重复的特殊数值,因此就不能通过下标的方式进行访问,且不会出现重复数值;

  JS中的集合

  在JavaScript中可以为集合提供一个数据结构,就是Set,MDN中的描述如下:

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

  集合中的操作

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

  添加元素到集合中;

  在集合中删除某元素;

  判断元素是否在集合中;

  清空集合;

  求交集、并集、差集;

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

</>复制代码

  1.   const arr = [1232345]
  2.   // 利用set实现去重
  3.   const set = new Set(arr) // [1, 2, 3, 4, 5]
  4.   // 往集合中添加元素
  5.   set.add(3// [1, 2, 3, 4, 5] 添加失败,集合中不允许出现重复元素
  6.   set.add(6// [1, 2, 3, 4, 5, 6]
  7.   // 判断元素是否在集合中
  8.   set.has(2// true
  9.   set.has(7// false
  10.   // 删除集合中的元素
  11.   set.delete(1// [2, 3, 4, 5, 6]
  12.   // 清空集合
  13.   set.clear()

  交集、并集、差集的封装

       我们现在来注释下:

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

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

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

  下图可以体现三者关系:

1.png

  封装代码如下:

</>复制代码

  1.   // 求两个集合的并集
  2.   export function union(setA, setB{
  3.   let _union = new Set(setA)
  4.   for (let elem of setB) {
  5.   _union.add(elem) // 因为集合中不存在重复元素
  6.   }
  7.   return _union
  8.   }
  9.   // 求两个集合的交集
  10.   export function intersection(setA, setB{
  11.   let _intersection = new Set()
  12.   for (let elem of setB) {
  13.   if (setA.has(elem)) {
  14.   _intersection.add(elem)
  15.   }
  16.   }
  17.   return _intersection
  18.   }
  19.   // 求两个集合的差集
  20.   export function difference(setA, setB{
  21.   let _difference = new Set(setA)
  22.   for (let elem of setB) {
  23.   _difference.delete(elem)
  24.   }
  25.   return _difference
  26.   }

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

      内容已讲述完毕,后续更多精彩内容,请多多关注。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/127798.html

相关文章

  • CSS技巧

    摘要:技巧使你的更加专业这是上关于技巧的一篇译文,另外你也可以在本项目看到原文。列举了一些很实用的技巧,比如给空内容的标签添加内容,逗号分隔列表等等。排序算法看源码,把它背下来吧排序算法的封装。主要帮助初学者更好的掌握排序算法的实现。 成为专业程序员路上用到的各种优秀资料、神器及框架 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 Java...

    DangoSky 评论0 收藏0
  • CSS技巧

    摘要:技巧使你的更加专业这是上关于技巧的一篇译文,另外你也可以在本项目看到原文。列举了一些很实用的技巧,比如给空内容的标签添加内容,逗号分隔列表等等。排序算法看源码,把它背下来吧排序算法的封装。主要帮助初学者更好的掌握排序算法的实现。 成为专业程序员路上用到的各种优秀资料、神器及框架 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 Java...

    zgbgx 评论0 收藏0
  • CSS技巧 - 收藏集 - 掘金

    摘要:笔者作为一位,将工作以来用到的各种优秀资料神器及框架整理在此,毕竟好记性不如烂键盘,此前端知识点大百科全书前端掘金,,不定期更新技巧前端掘金技巧,偶尔更新。计算数组的极值技巧使你的更加专业前端掘金一个帮你提升技巧的收藏集。 CSS 样式画各种图形 - 前端 - 掘金下面是一些我在 CSS 中经常用到的图案,还有一些是在css-tricks看到的。记录一下,以后会用到。会持续更新… 一、...

    Jonathan Shieber 评论0 收藏0
  • CSS技巧 - 收藏集 - 掘金

    摘要:笔者作为一位,将工作以来用到的各种优秀资料神器及框架整理在此,毕竟好记性不如烂键盘,此前端知识点大百科全书前端掘金,,不定期更新技巧前端掘金技巧,偶尔更新。计算数组的极值技巧使你的更加专业前端掘金一个帮你提升技巧的收藏集。 CSS 样式画各种图形 - 前端 - 掘金下面是一些我在 CSS 中经常用到的图案,还有一些是在css-tricks看到的。记录一下,以后会用到。会持续更新… 一、...

    SHERlocked93 评论0 收藏0
  • JavaScript学习总结(六)数据类型和JSON格式

    摘要:并列数据的集合数组用方括号表示。第三种类型是映射,也就是一个名值对,即数据有一个名称,还有一个与之相对应的值,这又称作散列或字典,比如首都北京。中有种简单数据类型也称为基本数据类型和。数值布尔值对象和字符串值都有方法。 什么是JSON JSON:JavaScript 对象表示法(JavaScript Object Notation)。 JSON的形式是用大括号{}包围起来的项目列表...

    laznrbfe 评论0 收藏0

发表评论

0条评论

3403771864

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<