Set
:Set对象允许你存储任何类型的值,无论是原始值或者是对象引用。类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成 Set 数据结构。
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i);
}
// 2 3 5 4
add(value)
:添加某个值,返回Set结构本身。
delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。
has(value)
:返回一个布尔值,表示该值是否为Set
的成员。
clear()
:清除所有成员,没有返回值。
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
Array.from
方法可以将 Set
结构转为数组。
const items = new Set([1, 2, 3, 4, 5]);
const array = Array.from(items);
这就提供了去除数组重复成员的另一种方法。
function dedupe(array) {
return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]
Set.prototype.keys()
:返回键名的遍历器;Set.prototype.values()
:返回键值的遍历器;Set.prototype.entries()
:返回键值对的遍历器;Set.prototype.forEach()
:使用回调函数遍历每个成员;for...of
直接遍历Set;注意:set
只有键值或者说键名和键值是同一个值
(1)keys(),values(),entries()
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"]
直接用for...of
循环遍历 Set
let set = new Set(['red', 'green', 'blue']);
for (let x of set) {
console.log(x);
}
// red
// green
// blue
(2)forEach()
let set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 4 : 4
// 9 : 9
(3)遍历的应用
扩展运算符(…)内部使用for…of循环,所以也可以用于 Set 结构。
let set = new Set(['red', 'green', 'blue']);
let arr = [...set];
// ['red', 'green', 'blue']
1. 数组去重
扩展运算符和 Set 结构相结合,就可以去除数组的重复成员。
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)];
// [3, 5, 2]
2. 合并两个Set对象
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
let union = new Set([...a, ...b]); // {1, 2, 3, 4}
WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有=区别。
WeakSet
之中。const ws = new WeakSet();
const a = [[1, 2],[3, 4]]
const ws = new WeakSet(a)
注意,这个a是一个数组,它有两个成员,也都是数组。将a作为 WeakSet 构造函数的参数,a的成员会自动成为 WeakSet 的成员。a数组的成员成为 WeakSet 的成员,而不是a数组本身。这意味着,数组的成员只能是对象。
// 数组b的成员不是对象,加入 WeakSet 就会报错。
const b = [3, 4];
const ws = new WeakSet(b);
console.log(ws) // 报错 Uncaught TypeError: Invalid value used in weak set(…)
方法
WeakSet.prototype.add(value)
:添加WeakSet.prototype.detele(value)
:删除WeakSet.prototype.has(value)
:返回一个布尔值,表示某个值是否在实例之中。size
属性,没有办法遍历它的成员类似于对象,也是键值对的集合,但是对象一般都是’字符串-值‘。Map结构提供了’值-值‘的对应。
size
属性`
返回 Map 结构的成员总数
set(key, value)
添加,如果key有值,则键值会被更新,否则生成新键,返回当前的Map
对象,因此可以采用和链式写法。
get(key)
get
方法读取key
对应的键值,如果找不到key
,返回undefined。
has(key)
has
方法返回一个布尔值,表示某个键是否在当前 Map
对象之中。
delete(key)
delete
方法删除某个键,返回true
。如果删除失败,返回false
。
clear()
clear
方法清除所有成员,没有返回值。
和Set
类似:keys(),values(),entries(),forEach()
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
可以直接使用for...of
遍历
// 等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"
如果 Map
结构为数组结构,我们可以使用扩展运算符(...
)
const map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
[...map.keys()]
// [1, 2, 3]
[...map.values()]
// ['one', 'two', 'three']
[...map.entries()]
// [[1,'one'], [2, 'two'], [3, 'three']]
[...map]
// [[1,'one'], [2, 'two'], [3, 'three']]
(1)Map 转为数组
最方便的方法是使用扩展运算符(...
)。
(2)数组 转为 Map
将数组传入 Map 构造函数
(3)Map 转为对象
如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名。
const map = new Map([
['F', 'no'],
['T', 'yes'],
]);
let obj = Object.create(null);
for(let [key,value] of map){
obj[key] = value;
}
console.log(obj); //结果
(4)对象转为 Map
可以通过Object.entries()
let obj = {"a": 1, "b": 2};
let map = new Map(Object.entries(obj));
WeakMap
const map = new WeakMap();
map.set(1, 2) // TypeError: 1 is not an object!
map.set(Symbol(), 2) // TypeError: Invalid value used as weak map key
map.set(null, 2) // TypeError: Invalid value used as weak map key
Map
是键值对,Set
是键的集合,当然键和值可以是任意值;Map
可以通过get
方法获取值,而Set
不能因为他只有值;for…of
遍历;Set
的值是唯一的可以做数组去重,Map
由于没有格式限制,可以做数据存储;map
和set
都是stl中的关联容器,map
以键值对的形式存储,key=value
组成pair,是一组映射关系。set
只有值,可以认为只有一个数据,并且set
中元素不可以重复且自动排序。