现代Javascript教程 - 学习笔记06 - Map & Set

384 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

刷题必备数据结构,可以实现查找,计数,去重,降低时间复杂度(时间换空间等,记录一下学习内容!

学习链接

Map and Set(映射和集合) (javascript.info)

简介

数据结构介绍

  • 对象 - 存储键值对 - 键为字符串
  • 数组 - 存储有序集合 - 开辟连续空间
  • Map - 也是键值对,和对象最大区别 - 允许任意类型的键
  • Set - 同map,没有重复的键!

Map的api

  • new Map()
  • map.set([key, value]) - 存储数据 - 修改数据
  • map.get(key) - 根据键获取 值 - **任意键,对象,数值等 **
  • map.has(key) - 是否存在 - O(1)时间复杂度
  • map.delete(key) - 删除
  • map.clear() - 情况map - 批量删除
  • map.size - 存储的个数

Map怎么比较键

  • 类似 ===
  • NaN 在map中是 === NaN的 - NaN作为键

Map可以链式调用

  • 每次都返回map本身 - return this!!!
  • 例如: 连续map.set().set()

Map迭代

  • map.keys() - 遍历所有键!
  • map.values() - 所有值
  • map.entries() - 所有[key, value] - 通常用for of,也可以forEach

从对象创建Map

  • 对象也有上面的三种遍历方式 - 都是键值对。。。
  • let map = new Map(Object.entries(obj) - new一个然后,内部遍历键值对

从map创建对象

  • let obj = Object.fromEntries(map.entries()) - 比较和上面区别!- 不用new
  • 里面的map.entries() 可以省略 - 这个函数,里面需要一个可迭代项,map可以!

Set

Set 是一个特殊的类型集合 —— “值的集合”(没有键),它的每一个值只能出现一次。

练习题 - leetcode 763划分字母区间

763. 划分字母区间

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

补一道leetcode题目!很好的用到了map!收藏!

通过map进行查找,

  • map记录字母 最后一次出现的下标 - map.set的时候,进行了覆盖

  • 双指针,从0开始,rihgt用来记录边界,比较最后出现的位置。

  • 如果right === i 说明到达边界

  • 计算长度,left = i + 1,用于计算下一次的长度!


var partitionLabels = function(s) 
{ 
    // 找到每个字母的右边界。 
    let map = new Map(); 
    for(let i = 0; i < s.length; i++) 
    { 
        // map中存储字母 和对应下标!字母用来查找,下标用来计算长度
        // 注意这里记录的下标,是该 字母,最后出现的位置!! 覆盖掉前面的了 
        map.set(s[i], i);  
    } 
    
    // 分割! 
    let right = left = 0; - 双指针 - 计算左右边界!
    let res = []; 

    for(let i = 0; i < s.length; i++) 
    { 
        // map中的值用来计算无重复值的最大长度!
        // right 用来保存 + 比较!
        // map.get - 获取值!
        right = Math.max(right, map.get(s[i])); 
        
        if(right === i) { // 如果右边等于当前值,说明到达边界!
        
            res.push(right - left + 1); 
            left = i + 1;  // 修改左指针,下一次的起点!
            
        } 
    } 
    return res; 
};

总结

前面一篇new 的总结 补上!- 创建一个新的空间 + this指代! -

  • 优点 - 便利性 - 实现可重用的对象创建代码。

Map和Set的总结!

这里主要介绍的是api,增删改查!

还可以转换成数组,进行排序!

我始终相信读过的书都不会白读,它总会在未来日子的某一个场合,帮助我表现的更加出色。