by @zhangbao(zhangbao) #0108
这里所谓的“对象”是指使用类似
var obj = {}
或var obj = new Object()
等方式声明的普通对象。
概览
- 从对象转为 Map :
new Map(Object.entries(obj))
- 从 Map 转为对象:
Object.fromEntries(map.entries())
Map 的两种创建方式
我们创建 Map 时,除了下面这种方式
还可以使用 new Map(iterable)
语法:
传入的数组参数,是由一个个键值对([key, value]
)组成的。这种创建方式,比使用 map.set
更加简洁和方便。
map.entries()
上面的一个个 [key, value]
又称为 entry。我们能行 entries 得到 map
,那么也能从 map
得到 entries。需要使用 Map.prototype.entries()
这个 Map 实例上定义的方法。
还是以上面的变量 map
举例:
map.entries()
得到的结果是是一个迭代对象(MapIterator
)。借助 Array.from
可以将迭代对象转为真实数组。
那么,问题来了——Map 与对象之间是如何相互转换的呢?答案是借助 entries 这个数据结构。
因此,我们先来认识一下 Object.entries
方法。
Object.entries
顾名思义,Object.entries
是用来将一个对象转为 entries 结构形式的。
下面举一个例子:
这样,我们就能从一个对象得到它的 entries 结构形式了。再带入 new Map()
:
现在就完成了“对象 -> Map”的转换了。
💡 提示: 值得注意的是,由于对象属性类型的限制(即对象属性名类型只能是字符串或 Symbol 值)。从对象转成 Map 时,Map key 的类型最多只会有两种:字符串或 Symbol 值。
Object.fromEntries
有 Object.entries
,就有 Object.fromEntries
。后者正是前者的反向操作。语法如下:
Object.fromEntries(iterable)
举个例子:
当然,上面的演示非常无聊。正儿八经得与 map.entries
结合使用才方便呢。
与 map.entries
结合使用:
map.entries
方法上面已有介绍。此方法用来将 Map 转为迭代对象的表现形式。
let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);
Object.fromEntries(map.entries())
// {
// "1": "num1",
// "true": "bool1"
// }
从上面的转换为对象的结果中,我们可以看见 ['1', 'str1']
这个键值对消失了,保留下来的是 [1, 'num1']
。而且 1
也变为 "1"
了。原因在于,对象的属性名只能是字符串或 Symbol 值两种,这是与 Map 的 key 不同的地方(Map 的 key 可以是任意类型的)。在从“Map -> 对象”的过程中,所以非 Symbol 类型的 key 最终都会被 Object.fromEntries
方法处理,转为字符串的表现形式。
(完)