Set && Map
1. Set
ES6 提供的新的数据结构,一组 key 的集合,类似于数组。但成员的值都是唯一的。
要创建一个 Set,需要提供一个 Array作为输入,或者直接创建一个空 set。
let s1 = new Set()
console.log(Object.prototype.toString.call(s1)) // [object Set]
let s2 = new Set([1, 2, 3])
console.log(s2) // Set(3) {1, 2, 3}
console.log([...s2]) // [1, 2, 3]
数组去重
let arr = ['a', 'b', 'c', 'c', 'b', null, null, NaN, NaN, {}]
console.log([...new Set(arr)]); // ["a", "b", "c", null, NaN, {…}]
字符串去重
let str = 'abbccddeffg'
console.log([...new Set(str)].join('')) // 'bcdefg'
Set 实例的属性和方法:
-
Set 结构的实例有以下属性:
- Set.prototype.size: 返回 Set 实例的成员总数;
-
Set 实例的方法:
- add(value): 添加某个值;
- delete(value): 删除某个值;
- has(value): 是否存在某个值,返回 布尔值;
- clear(): 清空所有值;
console.log(s3.add('d')); // Set(4) {"a", "b", "c", "d"}
console.log(s3.delete('b')); // true
console.log(s3.has('b')); // false
console.log(s3.clear()); // 没有返回值
console.log(s3); // Set(0) {}
2. Map
Map 是一组键值对的集合(传统上只能用字符创当做键值),并且具有非常的查找速度
- 初始化 Map 需要一个二位数组,或者是一个空 Map
let m1 = new Map([['aaa', 111], ['bbb', 222]])
console.log(m1); // Map(2) {"aaa" => 111, "bbb" => 222}
let m2 = new Map()
console.log(m2); // Map(0) {}
- 当需要查找一个学生的成绩时,对于一个 [姓名,成绩]的表(姓名 => 成绩),只需要知道该学生的姓名,便可查到对应的成绩。查找速度极快。
let map = new Map([['tom', 98], ['lili', 90], ['Join', 80]])
console.log(map); // Map(3) {"tom" => 98, "lili" => 90, "Join" => 80}
console.log(map.get('tom')); // 98
console.log(map.has('Join')); // true
- 一个 key 只能对应一个 value,当重复赋值时,将会产生覆盖。
let m3 = new Map([['aaa', 111], ['bbb', 222]])
m3.set('ccc', 333)
m3.set('ccc', 555)
console.log(m3); // Map(3) {"aaa" => 111, "bbb" => 222, "ccc" => 555}
console.log(m3.get('ccc')) // 555
-
Map 实例的遍历方法:
- keys():
- values():
- entries():
- forEach:
let m4 = new Map([['tom', 98], ['lili', 90], ['Join', 80]])
console.log(m4); // Map(3) {"tom" => 98, "lili" => 90, "Join" => 80}
console.log([...m4.keys()]) // ["tom", "lili", "Join"]
console.log([...m4.values()]) // [98, 90, 80]
console.log([...m4.entries()])
// 0:["tom", 98]
// 1:["lili", 90]
// 2:["Join", 80]
for(let key of m4.keys()) {
console.log(key); // tom, lili, Join
}
for(let value of m4.values()) {
console.log(value); // 98, 90, 80
}
for(let item of m4.entries()) {
console.log(item);
// ["tom", 98]
// ['lili', 90]
// ['Join', 80]
console.log(item[0] + ' => ' + item[1]);
// tom => 98
// lili => 90
// Join => 80
}
for(let [key, value] of m4.entries()) {
console.log(key + ' => ' + value);
// tom => 98
// lili => 90
// Join => 80
}
m4.forEach((value, key) => {
console.log(key + ' => ' + value);
// tom => 98
// lili => 90
// Join => 80
})