一.Set结构
Set结构是类似于数组结构,但是成员都是不重复的值(判断不重复类似Object.is()方法,但是+0和-0又是相同的处理,Object.is(+0,-0); // false)
缺点是没办法像数组一样通过下标取值的方法.
WeekSet结构和Set相似,但是成员只能是对象,且对象是弱引用(成员中的对象不存在了,在本结构中也就不存在了),重点是没有size属性,没有遍历接口
1.构造
任何具有Iterator接口的数据结构都能作为new Set的参数
let set = new Set([1,2,3]);
set.size // 3
2.属性和方法
(1)属性
- Set.prototype.constructor 构造函数:就是set本身
- Set.prototype.size :set的成员总数
(2)操作方法
- add(value) 添加值,返回添加后set本身
- delete(value) 删除某个值,返回Boolean,是否删除成功
- has(value) 是否含有某一个值,返回Boolean,是否有这个值
- clear() 请求所有成员,void
- 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); // true
s.has(2) // false
(3)遍历方法
- keys() 返回键名的遍历器
- values() 返回键值的遍历器
- entries() 返回键值对的遍历器
- forEach() 使用回掉函数遍历每一个set成员
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"]
set2 = new Set([1, 4, 9]);
set2.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 4 : 4
// 9 : 9
3.应用
(1)数组去重
let arr = [1,2,3,4,5,4,23,1,3];
arr= Array.from(new Set(arr)); // [1, 2, 3, 4, 5, 23]
(2)扩展运算符解构set
let arr = [1,2,3,4,5,4,23,1,3];
let set = new Set(arr);
let arr4 = [...set]; // [1, 2, 3, 4, 5, 23]
(3)set实现交集,并集,差集
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}
二.Map结构
Map结构是键值对集合(Hash结构).Map可以使用对象作为键名.map内部的键名的重复检测和Set相同
WeekMap结构类似Map,区别是键名只能是对象,且对象是弱引用,类似于WeekSet的弱引用
1.构造
任何具有Iterator接口的数据结构都能被Map构造为Map结构,但是结构要有一定的定制,类似于下方的数组的结构
const map = new Map([
['name', '张三'],
['title', 'Author']
]);
map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"
2.属性和方法
(1)属性
- Map.prototype.size :Map的成员数量
(2)操作方法
- set(key,value) 向map设置一个值,已有键名的会被覆盖,否则会新建,返回设置后的map
- get(key) 读取key对应的键值,没有则返回undefined
- has(key) 查找map中有没有某个键名,返回Boolean
- clear() 清楚所有成员,void
(3)遍历方法
和Set拥有同样的遍历方法
const map = new Map([
['F', 'no'],
['T', 'yes'],
]);
for (let key of map.keys()) {
console.log(key);
}
// "F"
// "T"
for (let value of map.values()) {
console.log(value);
}
// "no"
// "yes"
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"
// 等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"
map.forEach(function(value, key, map) {
console.log("Key: %s, Value: %s", key, value);
});