ES6 - 集合

ES6引入了两种新的数据结构:地图和集合.

  • 地图 : 此数据结构可以将键映射到值.

  • 设置 : 集类似于数组.但是,集合不鼓励重复.

地图

Map对象是一个简单的密钥/值对.地图中的键和值可以是原始的或对象.

以下是相同的语法.

new Map([iterable])

参数iterable表示其元素由键/值对组成的任何可迭代对象.地图是有序的,即它们按插入顺序遍历元素.

地图属性

Sr.NoProperty&描述
1Map.prototype.size

此属性返回键数/Map对象中的值对.

了解基本的地图操作

set()函数设置Map对象中键的值. set()函数有两个参数,即键及其值.此函数返回Map对象.

has()函数返回一个布尔值,指示是否在Map对象中找到指定的键.此函数将键作为参数.

var map = new Map(); 
map.set('name','Tutorial Point'); 
map.get('name'); // Tutorial point

上面的例子创建了一个地图对象.地图只有一个元素.元素键由 name 表示.键被映射到值教程点.

注意 : 地图区分相似的值但具有不同的数据类型.换句话说,整数键1 被认为与字符串键"1"不同.考虑以下示例以更好地理解此概念

 var map = new Map(); 
map.set(1,true); 
console.log(map.has("1")); //false 

map.set("1",true); 
console.log(map.has("1")); //true

输出

 
 false 
 true

set()方法也是可链接的.请考虑以下示例.

 
 var roles = new Map(); 
 roles.set('r1','User')
 .set('r2','Guest')
 .set('r3','Admin'); 
 console.log(roles.has('r1'))

输出

 
 True

上面的例子定义了一个地图对象.该示例链接set()函数以定义键/值对.

get()函数用于检索与指定键对应的值.

Map构造函数也可以传递给数组.此外,map还支持使用spread运算符来表示数组.

示例

var roles = new Map([ 
   ['r1', 'User'], 
   ['r2', 'Guest'], 
   ['r3', 'Admin'], 
]);  
console.log(roles.get('r2'))

成功执行上述代码后会显示以下输出.

 
 Guest

注意 : 如果指定的键在映射中不存在,则get()函数返回undefined.

如果键已经存在于映射中,则set()将替换该键的值.请考虑以下示例.

var roles = new Map([ 
   ['r1', 'User'], 
   ['r2', 'Guest'], 
   ['r3', 'Admin'], 
]);  
console.log(`value of key r1 before set(): ${roles.get('r1')}`) 
roles.set('r1','superUser') 
console.log(`value of key r1 after set(): ${roles.get('r1')}`)

以下输出是成功执行上述代码时显示.

value of key r1 before set(): User 
value of key r1 after set(): superUser

地图方法

Sr.No方法&描述
1Map.prototype.clear()

删除所有键/值对来自Map对象.

2Map.prototype.delete(key)

删除与该键关联的任何值,并返回Map.prototype.has(key)之前返回的值.

Map.prototype.has(key )之后将返回false.

3Map.prototype.entries()

返回一个新的Iterator对象,该对象包含一个 [key,value]数组,用于Map对象中的每个元素插入顺序.

4Map.prototype.forEach(callbackFn [,thisArg])

按插入顺序为Map对象中的每个键值对调用 callbackFn 一次.如果向forEach提供thisArg参数,它将被用作每个回调的'this'值.

5Map.prototype.keys()

按插入顺序返回一个新的Iterator对象,该对象包含Map对象中每个元素的 .

6Map.prototype.values()

以插入顺序返回一个新的Iterator对象,该对象包含 [key,value]数组,用于Map对象中的每个元素.

for循环的for ...

以下示例说明使用for ... of循环遍历地图.

'use strict' 
var roles = new Map([ 
   ['r1', 'User'], 
   ['r2', 'Guest'], 
   ['r3', 'Admin'], 
]);
for(let r of roles.entries()) 
console.log(`${r[0]}: ${r[1]}`);

成功执行上述代码后会显示以下输出.

r1: User 
r2: Guest 
r3: Admin

弱地图

弱地图与地图相同,但有以下例外 :

  • 其键必须是对象.

  • 弱地图中的密钥可以是垃圾收集. 垃圾收集是清除程序中未引用对象占用内存的过程.

  • 弱映射无法迭代或清除.

示例:弱地图

'use strict' 
let weakMap = new WeakMap(); 
let obj = {}; 
console.log(weakMap.set(obj,"hello"));  
console.log(weakMap.has(obj));// true

成功执行上述代码后会显示以下输出.

WeakMap {} 
true

设置

集合是ES6数据结构.它类似于一个数组,但它不能包含重复项.换句话说,它允许您存储唯一值.设置支持原始值和对象引用.

就像地图一样,集合也是有序的,即元素按其插入顺序迭代.可以使用以下语法初始化集合.

设置属性

Sr.NoProperty&描述
1Set.prototype.size

返回集合中的值的数量对象.

设置方法

Sr.NoMethod&描述
1Set.prototype.add(value)

追加新元素Set对象的给定值.返回Set对象.

2Set.prototype.clear()

从Set对象中删除所有元素.

3设置. prototype.delete(value)

删除与该值相关联的元素.

4Set.prototype.entries()

返回一个新的Iterator对象,其中包含 [value,value]的数组Set对象中的元素,按插入顺序排列.这类似于Map对象,因此每个条目的键和值都具有相同的值.

5Set.prototype.forEach(callbackFn [,thisArg])

对Set对象中的每个值调用 callbackFn 插入顺序.如果向forEach提供 athisArg 参数,则它将用作每个回调的"this"值.

6Set.prototype.has(value)

返回一个布尔值,断言一个元素是否与Set对象中的给定值一起出现.

7Set.prototype.values()

以插入顺序返回一个新的Iterator对象,其中包含Set对象中每个元素的.

弱集

弱集只能包含对象,它们包含的对象可能是垃圾收集的.像弱映射一样,弱集不能迭代.

示例:使用弱集

'use strict' 
   let weakSet = new WeakSet();  
   let obj = {msg:"hello"}; 
   weakSet.add(obj); 
   console.log(weakSet.has(obj)); 
   weakSet.delete(obj); 
   console.log(weakSet.has(obj));

成功执行上述代码后会显示以下输出.

true 
false

Iterator

Iterator是一个允许访问对象集合的对象一次一个. set和map都有返回迭代器的方法.

迭代器是 next()方法的对象.当调用next()方法时,它返回一个具有'value''done'属性的对象. 'done'是boolean,在读取集合中的所有项目后返回true

示例1:Set和Iterator

var  set = new Set(['a','b','c','d','e']);  
var iterator = set.entries(); 
console.log(iterator.next())

成功执行上述代码后会显示以下输出.

{ value: [ 'a', 'a' ], done: false }

由于该集合不存储键/值,因此值数组包含类似的键和值.完成将是假的,因为有更多的元素要读.

示例2:设置和迭代器

var  set = new Set(['a','b','c','d','e']);  
var iterator = set.values(); 
console.log(iterator.next());

成功执行上述代码后会显示以下输出.

{ value: 'a', done: false }

示例3:设置和迭代器

var  set = new Set(['a','b','c','d','e']);  
var iterator = set.keys(); 
console.log(iterator.next());

成功执行上述代码后会显示以下输出.

{ value: 'a', done: false }

示例4:地图和迭代器

var map = new Map([[1,'one'],[2,'two'],[3,'three']]); 
var iterator = map.entries(); 
console.log(iterator.next());

成功执行上述代码后会显示以下输出.

{ value: [ 1, 'one' ], done: false }

示例5:Map和Iterator

var map = new Map([[1,'one'],[2,'two'],[3,'three']]); 
var iterator = map.values(); 
console.log(iterator.next());

成功执行上述代码后会显示以下输出.

{value: "one", done: false}

示例6:Map和Iterator

var map = new Map([[1,'one'],[2,'two'],[3,'three']]); 
var iterator = map.keys(); 
console.log(iterator.next());

成功执行上述代码后会显示以下输出.

{value: 1, done: false}