Map与Set Map Map
对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值 ) 都可以作为一个键或一个值。
描述 一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for...of
循环在每次迭代后会返回一个形式为[key,value]的数组。
构造函数 Map()
创建 Map
对象
属性 Map.length
属性 length 的值为 0 。 想要计算一个Map
中的条目数量, 使用 Map.prototype.size
。
get Map
本构造函数用于创建派生对象。
Map.prototype
表示 Map
构造器的原型。 允许添加属性从而应用于所有的 Map
对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 let myMap = new Map ();let keyObj = {};let keyFunc = function ( ) {};let keyString = 'a string' ;myMap.set (keyString, "和键'a string'关联的值" ); myMap.set (keyObj, "和键keyObj关联的值" ); myMap.set (keyFunc, "和键keyFunc关联的值" ); myMap.size ; myMap.get (keyString); myMap.get (keyObj); myMap.get (keyFunc); myMap.get ('a string' ); myMap.get ({}); myMap.get (function ( ) {});
方法 set()
描述 set()
方法为 Map
对象添加或更新一个指定了键(key
)和值(value
)的(新)键值对。
参数 key
要添加至相应 Map
对象的元素的键。
value
要添加至相应 Map
对象的元素的值。
返回值 Map
对象
get()
描述 get()
方法返回某个 Map
对象中的一个指定元素。
参数 key
必须参数,也是它唯一的参数,要从目标 Map
对象中获取的元素的键。
返回值 返回一个 Map
对象中与指定键相关联的值,如果找不到这个键则返回 undefined
。
has()
描述 方法has()
返回一个bool值,用来表明map 中是否存在指定元素.
参数 key
必填. 用来检测是否存在指定元素的键值.
返回值 Boolean
如果指定元素存在于Map中,则返回true
。其他情况返回false
keys()
描述 keys()
返回一个引用的 Iterator
对象。它包含按照顺序插入 Map
对象中每个元素的key值。
返回值 一个存在引用关系的 Map
iterator 对象。
values()
描述 values()
方法返回一个新的Iterator对象。它包含按顺序插入Map对象中每个元素的value值。
返回值 一个新的 Map
可迭代对象。
delete()
描述 delete()
方法用于移除 Map
对象中指定的元素。
参数 key
必须。从 Map
对象中移除的元素的键。
返回值 Boolean
如果 Map
对象中存在该元素,则移除它并返回 true
;否则如果该元素不存在则返回 false
。
clear()
描述 clear()
方法会移除Map对象中的所有元素。
返回值 undefined
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 let myMap = new Map ();let keyObj = {};let keyFunc = function ( ) {};let keyString = 'a string' ;myMap.set (keyString, "和键'a string'关联的值" ); myMap.set (keyObj, "和键keyObj关联的值" ); myMap.set (keyFunc, "和键keyFunc关联的值" ); myMap.size ; myMap.get (keyString); myMap.get (keyObj); myMap.get (keyFunc); myMap.get ('a string' ); myMap.get ({}); myMap.get (function ( ) {});
迭代 使用for..of
方法迭代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 let myMap = new Map ();myMap.set (0 , "zero" ); myMap.set (1 , "one" ); for (let [key, value] of myMap) { console .log (key + " = " + value); } for (let key of myMap.keys ()) { console .log (key); } for (let value of myMap.values ()) { console .log (value); } for (let [key, value] of myMap.entries ()) { console .log (key + " = " + value); }
使用forEach()
方法迭代 1 2 3 4 myMap.forEach (function (value, key ) { console .log (key + " = " + value); })
Map与数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 let kvArray = [["key1" , "value1" ], ["key2" , "value2" ]];let myMap = new Map (kvArray);myMap.get ("key1" ); console .log (Array .from (myMap)); console .log ([...myMap]);console .log (Array .from (myMap.keys ()));
复制或合并 1 2 3 4 5 6 7 8 let original = new Map ([ [1 , 'one' ] ]); let clone = new Map (original);console .log (clone.get (1 )); console .log (original === clone);
Map对象间可以进行合并,但是会保持键的唯一性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 let first = new Map ([ [1 , 'one' ], [2 , 'two' ], [3 , 'three' ], ]); let second = new Map ([ [1 , 'uno' ], [2 , 'dos' ] ]); let merged = new Map ([...first, ...second]);console .log (merged.get (1 )); console .log (merged.get (2 )); console .log (merged.get (3 ));
Map对象也能与数组合并:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let first = new Map ([ [1 , 'one' ], [2 , 'two' ], [3 , 'three' ], ]); let second = new Map ([ [1 , 'uno' ], [2 , 'dos' ] ]); let merged = new Map ([...first, ...second, [1 , 'eins' ]]);console .log (merged.get (1 )); console .log (merged.get (2 )); console .log (merged.get (3 ));
Set Set
对象允许你存储任何类型的唯一值,无论是原始值 或者是对象引用。
描述 Set
对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次 ,即 Set 中的元素是唯一的。
因为 Set 中的值总是唯一的,所以需要判断两个值是否相等。在ECMAScript规范的早期版本中,这不是基于和===操作符中使用的算法相同的算法。
构造函数 Set()
创建一个新的Set
对象。
属性 Set.prototype.size
返回 Set 对象中的值的个数
方法 add()
描述 add()
方法用来向一个 Set
对象的末尾添加一个指定的值。
参数 value
必需。需要添加到 Set
对象的元素的值。
返回值 Set
对象本身
has()
描述 has() 方法返回一个布尔值来指示对应的值value是否存在Set对象中。
参数 value
必需。用以测试该值是否存在于 Set 对象中。
返回值 Boolean
如果指定的值(value)存在于Set对象当中,返回true
;否则返回 false
。
values()
描述 values()
方法按照元素插入顺序返回一个具有 Set
对象每个元素值的全新 Iterator
对象。
返回值 按照元素插入顺序返回一个包含给定的 Set
对象中每个元素值的全新 **Iterator**
对象。
delete()
描述 delete()
方法可以从一个 Set
对象中删除指定的元素。
参数 value
将要删除的元素
返回值 成功删除返回 true
,否则返回 false。
clear()
描述 clear()
方法用来清空一个 Set
对象中的所有元素。
返回值 undefined
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 let mySet = new Set ();mySet.add (1 ); mySet.add (5 ); mySet.add (5 ); mySet.add ("some text" ); let o = {a : 1 , b : 2 };mySet.add (o); mySet.add ({a : 1 , b : 2 }); mySet.has (1 ); mySet.has (3 ); mySet.has (5 ); mySet.has (Math .sqrt (25 )); mySet.has ("Some Text" .toLowerCase ()); mySet.has (o); mySet.size ; mySet.delete (5 ); mySet.has (5 ); mySet.size ; console .log (mySet);
迭代 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 for (let item of mySet) console .log (item);for (let item of mySet.keys ()) console .log (item);for (let item of mySet.values ()) console .log (item);for (let [key, value] of mySet.entries ()) console .log (key);var myArr = Array .from (mySet); mySet.add (document .body ); mySet.has (document .querySelector ("body" )); mySet2 = new Set ([1 , 2 , 3 , 4 ]); mySet2.size ; [...mySet2]; let intersection = new Set ([...set1].filter (x => set2.has (x)));let difference = new Set ([...set1].filter (x => !set2.has (x)));mySet.forEach (function (value ) { console .log (value); });
集合操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 function isSuperset (set, subset ) { for (let elem of subset) { if (!set.has (elem)) { return false ; } } return true ; } function union (setA, setB ) { let _union = new Set (setA); for (let elem of setB) { _union.add (elem); } return _union; } function intersection (setA, setB ) { let _intersection = new Set (); for (let elem of setB) { if (setA.has (elem)) { _intersection.add (elem); } } return _intersection; } function symmetricDifference (setA, setB ) { let _difference = new Set (setA); for (let elem of setB) { if (_difference.has (elem)) { _difference.delete (elem); } else { _difference.add (elem); } } return _difference; } function difference (setA, setB ) { let _difference = new Set (setA); for (let elem of setB) { _difference.delete (elem); } return _difference; } let setA = new Set ([1 , 2 , 3 , 4 ]), setB = new Set ([2 , 3 ]), setC = new Set ([3 , 4 , 5 , 6 ]); isSuperset (setA, setB); union (setA, setC); intersection (setA, setC); symmetricDifference (setA, setC); difference (setA, setC);
Set与数组 1 2 3 4 5 6 7 8 9 let myArray = ["value1" , "value2" , "value3" ];let mySet = new Set (myArray);mySet.has ("value1" ); console .log ([...mySet]);
Set与字符串 1 2 3 4 5 6 7 8 let text = 'India' ;let mySet = new Set (text); mySet.size ; new Set ("Firefox" ) new Set ("firefox" )
数组去重 1 2 3 4 const numbers = [2 ,3 ,4 ,4 ,2 ,3 ,3 ,4 ,4 ,5 ,5 ,6 ,6 ,7 ,5 ,32 ,3 ,4 ,5 ]console .log ([...new Set (numbers)])