set
它类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构。
//Set()构造函数
let arr =[4,6,7,2,3,4,3,3,3,6,7,8,9]
let set =new Set(arr)
console.log(set) // Set { 4, 6, 7, 2, 3, 8, 9 }
let set = new Set()
set.add(10)
set.add(20)
set.add(50)
set.add(10)//不能重复
console.log(set) // Set { 10, 20, 50 }
上面代码通过add
方法向Set结构加入成员,结果表明Set结构不会添加重复的值,可以实现数组的去重
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)]; // [3, 5, 2]
Set 结构的实例有以下属性:
1)Set.prototype.constructor:构造函数,默认就是Set函数。 2)Set.prototype.size:返回Set实例的成员总数。
Set 结构的实例有以下方法:
add(value) | 添加某个值,返回Set结构本身 |
delete(value) | 删除某个值,返回一个布尔值,表示删除是否成功 |
has(value) | 返回一个布尔值,表示该值是否为Set的成员 |
clear() | 清空set对象,没有返回值 |
keys() | 返回键名的遍历器 |
values() | 返回键值的遍历器 |
entries() | 返回键值对的遍历器(for in) |
forEach() | 使用回调函数遍历每个成员 |
size | 获取成员个数 |
s.add(1).add(2).add(2); // 注意2被加入了两次
s.size // 2
s.has(1) // true
s.has(2) // true
s.has(3) // false
s.delete(2);
s.has(2) // false
var items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size // 5
Set结构的实例有四个遍历方法,可以用于遍历成员。keys(),values(),entries(),forEach()
let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
console.log(item); //red green blue
}
for (let item of set.values()) {
console.log(item); //red green blue
}
for (let item of set.entries()) {
console.log(item); // ["red", "red"] ["green", "green"] ["blue", "blue"]
}
let set = new Set(['red', 'green', 'blue']);
let arr = [...set]; // ['red', 'green', 'blue']
可以省略values方法,直接用for...of循环遍历Set
let set = new Set(['red', 'green', 'blue']);
for (let x of set) {
console.log(x); //red green blue
}
因此使用Set可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
如果想在遍历操作中,同步改变原来的Set结构,目前没有直接的方法,但有两种变通方法。一种是利用原Set结构映射出一个新的结构,然后赋值给原来的Set结构;另一种是利用Array.from
方法。
// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// set的值是2, 4, 6
// 方法二
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2));
// set的值是2, 4, 6
Map
ES6提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现
//参数必须为数组,数组项也要为数组 map-->object
let map = new Map([['name','tom'],['age','12']])
// console.log(map) //Map { 'name' => 'tom', 'age' => '12' }
// map.set('gender','male')
// console.log(map.get('name')) //tom
// console.log(map) //Map { 'name' => 'tom', 'age' => '12', 'gender' => 'male' }
map.delete('age')
console.log(map) //Map { 'name' => 'tom' }
console.log(map.size) //1