在 ES6 中,提供了两种新的数据结构:Map 和 Set。Map 对象是一个简单的键/值映射,而 Set 对象是一种集合类型,其中每个值只能出现一次。本篇文章将深入探讨这两种数据结构的详细用法。
Map 数据结构
Map 对象是一个无序的键值对,其中键可以是任何类型(包括 undefined),值也可以是任何类型。它比普通对象有很多优点:
- 对于普通对象,键只能是字符串或 Symbol 类型,而 Map 的键可以是任何类型;
- Map 的键值对可以遍历且顺序是按照插入顺序保证的;
- 可以很容易地获取到 Map 中键值对的数量。
下面是 Map 对象的基本操作示例:
-- -------------------- ---- ------- -- ----- --- ----- ----- - --- ------ -- - --- ------ ----------------- ---------- ----------------- ---------- ----------------- ---------- -- -- --- --- ------------------------------- -- -------- -- -- --- -------- ------------------------------- -- ---- -- -- --- ------- ------------------------ -- - -- -- --- ----- --- ---- ----- ------ -- ------ - ------------------- -- ----------- - -- ----- -- ------- -- ----- -- ------- -- ----- -- -------
需要注意的是,Map 对象的键值对顺序是按照插入顺序保证的。如果需要按照其它顺序遍历键值对,可以使用 keys()
、values()
和 entries()
方法得到对应的迭代器,然后使用迭代器中的方法进行排序和筛选。
Set 数据结构
Set 对象是一个集合,集合中的元素按照插入顺序进行排序且唯一。 Set 对象也有很多优点:
- 集合中的元素唯一,不会重复出现;
- 可以很容易地获取集合中元素的数量;
- 可以很容易地求两个集合的交、差和并集。
下面是 Set 对象的基本操作示例:
-- -------------------- ---- ------- -- ----- --- ----- ----- - --- ------ -- ----- --- - ------------- ------------- ------------- ------------- -- ------ -- -- --- ------ ------------------------ -- - -- -- --- --------- -------------------------- -- ---- -- -- --- ---- --- ---- ---- -- ------ - ------------------ - -- - -- - -- - -- --- --- --------- ----- ---- - --- ------- -- ---- ----- ---- - --- ------- -- ---- ----- --------------- - --- ------------------------- -- ----------------- ----------------------------- -- --- --- -- ----- -------- - --- ------------- ---------- ---------------------- -- --- --- -- -- -- ----- ------------- - --- ------------------------- -- ------------------ --------------------------- -- --- ---
需要注意的是,Set 对象中的元素唯一且按照插入顺序进行排序。如果需要按照其它顺序遍历元素,可以使用 values()
方法得到一个迭代器,然后使用迭代器中的方法进行排序和筛选。
总结
在 JavaScript 中使用 Map 和 Set 数据结构可以帮助我们更加高效地处理数据。Map 数据结构可以处理键值对,Set 数据结构可以处理集合。两者都有很多优点,然而,在实际应用中,需要根据实际情况选择应该使用哪种数据结构。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/652dd2177d4982a6ebef32bf