JS短文 | 5分钟了解 JS Maps 对象
bigegpt 2024-10-09 08:08 7 浏览
作者:Kyle Cook
网站:Web Dev Simplified Blog
字数:1975 字 (非直译)
阅读: 5 分钟
一、开篇语
在日常的业务开发中,以下的代码你是否经常见或经常写呢?
const CURRENCY_MAP = {
'United States': 'USD',
'India': 'Rupee'
}
const currency = CURRENCY_MAP['India']
或者
const CURRENCIES = [
{ name: 'USD', country: 'United States' },
{ name: 'Rupee', country: 'India' }
]
const currency = CURRENCIES.find(c => c.country === 'India').name
以上代码确实没有问题,我们在业务中经常用,但是需要创建键值映射关系时,objects 对象 和 arrays 数组 通常不是最佳选择,这也是 JS Map 对象 存在的理由,今天我们就来简单地聊一聊 JS Map 。
二、Objects 和 Maps 的区别
Map 其实是是 JS 中的 Class 类,允许你将值存储在特定的键上,但是与 Objects 对象 有一些主要的区别,这些特质,主要是让 Map 在键值应用上表现得更加出色。
1、键的类型上(Key Types)
对于 Objects 类型而言,你只能使用字符串作为键的类型(ES6 中也可以是 Symbol 类型),但是 Map 则更宽泛得多,你可以使用任何数据类型作为键,比如你可以使用 object, string, boolean, function 等类型,接下来我们来看看下面两段代码:
const obj = {
a: 'b',
1: 2
}
console.log(Object.keys(obj))
// ["a", "1"]
const map = new Map([
['a', 'b'],
[1, 2],
[{ key: 'value' }, 'obj']
])
console.log(map.keys())
// ["a", 1, { key: "value" }]
创建 map 你需要通过数组的形式进行创建,我们可以通过 map.keys() 方法获取 map 对象的键,以数组的形式返回所有的键。
2、顺序(Ordering)
object 对象 键的顺序是不可靠的,直到 ES6 才对其进行规范(自 ECMAScript 2015 规范以来,对象确实保留了字符串和 Symbol 键的创建顺序; 因此,在只有字符串键的对象上进行迭代将按插入顺序产生键),则 Map 对象 则不同,当我们对其进行迭代时,则是按照其插入的键值顺序返回的,这个特性很重要。
3、迭代(Iterating)
相对迭代操作,Maps 相对 objects 更加容易,对象没有内置的迭代方法,需要借助 Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,Maps 则天生具有迭代性,这意味着你可以使用 forEach 方法作用于 Maps 上进行迭代。
4、长度(Length)
获取 objects 的长度并不容易,你需要手动计算,并且比较麻烦。但是 Maps 有个 size 属性,类似 arrays 数组 的 length 属性 能够准确地获取 Maps 键/值对的个数。
5、性能(Performance)
由于 Maps 设计的初衷就是为了解决 键/值 查找,因此在频繁地增删 键/值 操作的场景下,Map 的性能会更好,则 objects 则没有在这种频繁操作 键/值 的场景进行优化。
三、如何使用 Maps
通过上面的介绍,我们已经了解了 Maps 和 objects 的区别,接下来聊聊如何使用 Maps。
1、创建 Map(Creating A Map)
在上面的例子中,你也许看到了我们是如何创建 Map 的,Map 是一个 Class 类,需要进行实例化,如果你只实例化,不进行传参的话,则是一个空对象。如果需要填充内容的话,需要往里添加可迭代的对象值,比如数组,第一个是键,第二个是键对应的值。
const emptyMap = new Map()
const map = new Map([
['key', 'value']
])
2、设置值(Setting Values)
一旦你创建了 Map,接下来你很有可能需要往里填充 键/值 内容,我们可以使用 set 方法,进行 键/值 设置,如下段代码所示:
const map = new Map()
map.set('key', 'value')
map.set(true, 'boolean')
// "key" => "value"
// true => "boolean"
3、获取值(Getting Values)
获取值和设置值一样简单,我们可以通过 get 方法,并且传递一个你想获取键的参数,就能获取对应的值。如果键不存在,则返回 undefined。
const map = new Map()
map.set('key', 'value')
map.set(true, 'boolean')
map.get('key')
// "value"
map.get(true)
// "boolean"
map.get('wrong-key')
// undefined
4、确认键是否存在(Checking For Values)
有时你需要查看 Map 对应的键是否存在,你可以使用 has 方法 检查对应的键是否存在。
const map = new Map()
map.set(1, 'number')
map.has(1)
// true
map.has('1')
// false
map.has('wrong-key')
// false
您可能会注意到,检查键时,字符串”1“将返回 false。这是因为 Map 可以存储任何类型,所以数字 1 存储为数字而不是字符串。
5、删除键/值(Removing Values)
增删改查是我们最常见的业务操作,如果你要进行删除操作,同样对于 Map 也十分简单,我们可以使用 delete 方法传递你要删除的键。
const map = new Map()
map.set(1, 'number')
map.set('a', 'b')
map.delete(1)
map.has(1)
// false
6、迭代操作(Iterating Over A Map)
有很多方法可以迭代遍历 Map,但是最常见的方法就是通过 forEach 方法 进行迭代。类似数组的 forEach 方法,但是这个回调方法里,含有两个参数,一个表示于值,一个表示键。
const map = new Map()
map.set(1, 'number')
map.set('a', 'b')
map.forEach((value, key) => {
console.log(`${key} => ${value}`)
})
// 1 => number
// a => b
四、其它有用的方法和属性
- 你可以使用 size 属性 获取 Map 键/值对的个数。
- 你可以使用 keys() 方法获取 Map 中所有的键,返回一个可迭代的数组。
- 你可以使用 values() 方法获 Map 中所有的值,返回一个可迭代的数组。
- 你可以使用 entries() 方法获得包含键/值对的数组的集合数组。
- 你可以使用 clear() 方法清空 Map 中所有的键/值内容。
五、结束语
Maps 是一个很棒的数据类型,当我们需要频繁使用键值字典查找操作时,是一个不错的选择。今天的内容就到这里,感谢你的阅读。
相关推荐
- 最全的MySQL总结,助你向阿里“开炮”(面试题+笔记+思维图)
-
前言作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上...
- Redis数据库从入门到精通(redis数据库设计)
-
目录一、常见的非关系型数据库NOSQL分类二、了解Redis三、Redis的单节点安装教程四、Redis的常用命令1、Help帮助命令2、SET命令3、过期命令4、查找键命令5、操作键命令6、GET命...
- netcore 急速接入第三方登录,不看后悔
-
新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢。如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下:https://oauthlogin.net/前言此次带来得这个小项目是...
- 精选 30 个 C++ 面试题(含解析)(c++面试题和答案汇总)
-
大家好,我是柠檬哥,专注编程知识分享。欢迎关注@程序员柠檬橙,编程路上不迷路,私信发送以下关键字获取编程资源:发送1024打包下载10个G编程资源学习资料发送001获取阿里大神LeetCode...
- Oracle 12c系列(一)|多租户容器数据库
-
作者杨禹航出品沃趣技术Oracle12.1发布至今已有多年,但国内Oracle12C的用户并不多,随着12.2在去年的发布,选择安装Oracle12c的客户量明显增加,在接下来的几年中,Or...
- flutter系列之:UI layout简介(flutter-ui-nice)
-
简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。在flutter中,基本上所有的对象都是wi...
- Flutter 分页功能表格控件(flutter 列表)
-
老孟导读:前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析来来。PaginatedDataTablePaginatedDataTable是一个带分页功能的DataTable,...
- Flutter | 使用BottomNavigationBar快速构建底部导航
-
平时我们在使用app时经常会看到底部导航栏,而在flutter中它的实现也较为简单.需要用到的组件:BottomNavigationBar导航栏的主体BottomNavigationBarI...
- Android中的数据库和本地存储在Flutter中是怎样实现的
-
如何使用SharedPreferences?在Android中,你可以使用SharedPreferencesAPI来存储少量的键值对。在Flutter中,使用Shared_Pref...
- Flet,一个Flutter应用的实用Python库!
-
▼Flet:用Python轻松构建跨平台应用!在纷繁复杂的Python框架中,Flet宛如一缕清风,为开发者带来极致的跨平台应用开发体验。它用最简单的Python代码,帮你实现移动端、桌面端...
- flutter系列之:做一个图像滤镜(flutter photo)
-
简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起...
- flutter软件开发笔记20-flutter web开发
-
flutterweb开发优势比较多,采用统一的语言,就能开发不同类型的软件,在web开发中,特别是后台式软件中,相比传统的html5开发,更高效,有点像c++编程的方式,把web设计出来了。一...
- Flutter实战-请求封装(五)之设置抓包Proxy
-
用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来...
- 为什么不在 Flutter 中使用全局变量来管理状态
-
我相信没有人用全局变量来管理Flutter应用程序的状态。毫无疑问,我们的Flutter应用程序需要状态管理包或Flutter的基本小部件(例如InheritedWidget或St...
- Flutter 攻略(Dart基本数据类型,变量 整理 2)
-
代码运行从main方法开始voidmain(){print("hellodart");}变量与常量var声明变量未初始化变量为nullvarc;//未初始化print(c)...
- 一周热门
- 最近发表
-
- 最全的MySQL总结,助你向阿里“开炮”(面试题+笔记+思维图)
- Redis数据库从入门到精通(redis数据库设计)
- netcore 急速接入第三方登录,不看后悔
- 精选 30 个 C++ 面试题(含解析)(c++面试题和答案汇总)
- Oracle 12c系列(一)|多租户容器数据库
- flutter系列之:UI layout简介(flutter-ui-nice)
- Flutter 分页功能表格控件(flutter 列表)
- Flutter | 使用BottomNavigationBar快速构建底部导航
- Android中的数据库和本地存储在Flutter中是怎样实现的
- Flet,一个Flutter应用的实用Python库!
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)