Collections
ES6引入了两种新的数据结构:地图和集合。
Maps - 此数据结构可将键映射到值。
Sets - 集类似于数组。 但是,集合不鼓励重复。
Maps
Map对象是一个简单的键/值对。 地图中的键和值可以是原始的或对象。
以下是相同的语法。
new Map([iterable])
参数iterable表示任何可迭代对象,其元素包含键/值对。 映射是有序的,即它们按插入顺序遍历元素。
地图属性
Sr.No | 财产和描述 |
---|---|
1 | Map.prototype.size 此属性返回Map对象中键/值对的数量。 |
了解基本的Map操作
set()函数设置Map对象中键的值。 set()函数有两个参数,即键及其值。 此函数返回Map对象。
has()函数返回一个布尔值,指示是否在Map对象中找到指定的键。 此函数将键作为参数。
var map = new Map();
map.set('name','Tutorial Point');
map.get('name'); // Tutorial point
上面的示例创建了一个地图对象。 地图只有一个元素。 元素键由name表示。 键被映射到值Tutorial point 。
Note - 地图区分相似值但具有不同的数据类型。 换句话说, integer key 1被认为与string key “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
输出 (Output)
false
true
set()方法也是可链接的。 请考虑以下示例。
var roles = new Map();
roles.set('r1', 'User')
.set('r2', 'Guest')
.set('r3', 'Admin');
console.log(roles.has('r1'))
输出 (Output)
True
上面的示例定义了一个地图对象。 该示例链接set()函数以定义键/值对。
get()函数用于检索与指定键对应的值。
Map构造函数也可以传递给数组。 而且,map还支持使用spread运算符来表示数组。
例子 (Example)
var roles = new Map([
['r1', 'User'],
['r2', 'Guest'],
['r3', 'Admin'],
]);
console.log(roles.get('r2'))
成功执行上述代码后,将显示以下输出。
Guest
Note - 如果映射中不存在指定的键,则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 | 方法和描述 |
---|---|
1 | Map.prototype.clear() 从Map对象中删除所有键/值对。 |
2 | Map.prototype.delete(key) 删除与该键关联的任何值,并返回Map.prototype.has(key)先前返回的值。 Map.prototype.has(key)之后将返回false。 |
3 | Map.prototype.entries() 返回一个新的Iterator对象, an array of对象包含插入顺序中Map对象中每个元素an array of [key,value] an array of 。 |
4 | Map.prototype.forEach(callbackFn[, thisArg]) 按插入顺序为Map对象中存在的每个键值对callbackFn一次callbackFn 。 如果向forEach提供thisArg参数,则它将用作每个回调的“this”值。 |
5 | Map.prototype.keys() 返回一个新的Iterator对象,该对象包含插入顺序中Map对象中每个元素的keys 。 |
6 | Map.prototype.values() 返回一个新的Iterator对象, an array of对象包含插入顺序中Map对象中每个元素an array of [key,value] an array of 。 |
循环的...
以下示例说明了使用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
弱地图
弱地图与地图相同,但以下情况除外 -
它的键必须是对象。
弱地图中的键可以是垃圾收集。 Garbage collection是清除程序中未引用对象占用的内存的过程。
弱映射无法迭代或清除。
示例:弱地图
'use strict'
let weakMap = new WeakMap();
let obj = {};
console.log(weakMap.set(obj,"hello"));
console.log(weakMap.has(obj));// true
成功执行上述代码后,将显示以下输出。
WeakMap {}
true
Sets
集合是ES6数据结构。 它类似于一个数组,但它不能包含重复项。 换句话说,它允许您存储唯一值。 设置支持原始值和对象引用。
就像地图一样,集合也是有序的,即元素按其插入顺序迭代。 可以使用以下语法初始化集合。
设置属性
Sr.No | 财产和描述 |
---|---|
1 | Set.prototype.size 返回Set对象中的值的数量。 |
设置方法
Sr.No | 方法和描述 |
---|---|
1 | Set.prototype.add(value) 将具有给定值的新元素追加到Set对象。 返回Set对象。 |
2 | Set.prototype.clear() 从Set对象中删除所有元素。 |
3 | Set.prototype.delete(value) 删除与值关联的元素。 |
4 | Set.prototype.entries() 以插入顺序返回一个新的Iterator对象, an array of对象包含Set对象中每个元素an array of [value,value] an array of 。 这类似于Map对象,因此每个条目的键和值都具有相同的值。 |
5 | Set.prototype.forEach(callbackFn[, thisArg]) 按插入顺序为Set对象中的每个值调用callbackFn一次。 如果为forEach提供athisArg参数,则它将用作每个回调的“this”值。 |
6 | Set.prototype.has(value) 返回一个布尔值,声明一个元素是否与Set对象中的给定值一起出现。 |
7 | Set.prototype.values() 返回一个新的Iterator对象,该对象包含插入顺序中Set对象中每个元素的values 。 |
弱集
弱集只能包含对象,它们包含的对象可能是垃圾回收。 像弱地图一样,弱集不能迭代。
示例:使用弱集
'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:Set和Iterator
var set = new Set(['a','b','c','d','e']);
var iterator = set.values();
console.log(iterator.next());
成功执行上述代码后,将显示以下输出。
{ value: 'a', done: false }
示例3:Set和Iterator
var set = new Set(['a','b','c','d','e']);
var iterator = set.keys();
console.log(iterator.next());
成功执行上述代码后,将显示以下输出。
{ value: 'a', done: false }
示例4:Map和Iterator
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}