今天面试的时候,面试官问我,有没有用过Set和Map,我说没有,然后就没有然后了。。。我是个傻子??昨天 还用Set写了数组去重!ε=(´ο`*)))唉,还是不熟悉啊,接着学吧,看了一遍资料,来总结一波:
Set
Set本身是一个构造函数,用来生成Set数据结构。类似于数组,只是说里面的元素没有重复的。这点类似于数学里面的集合。
Set的定义:
let set = new Set()
Set()也可以接受一个数组作为参数:
const set = new Set([1,1,2,3,4,2])
console.log([...set]) // [1,2,3,4]
注意:Set中的值不会进行类型转换,数字1和字符串’1’是两个元素,因为其内部判断的方式是一个类似于===的运算符Same-value equality’’
Set的属性
Set的实例下有两个属性:
- constructor :构造函数
- size: 表示Set中含有的元素的个数
Set的操作方法
- 新增:add(),返回Set结构本身
- 删除:delete(),返回是否删除成功的布尔值
- 清除:clear(),无返回值
- 判断元素a是否在其中:has(a),存在返回true,不存在返回false
示例:
let set = new Set()
set.add(1).add(2).add(3).add(3)
console.log([...set]) // [1,2,3]
set.delete(1) // true
console.log([...set]) // [2,3]
set.delete(5) // false
set.has(5) // false
set.clear()
console.log([...set]) // []
Set的遍历方法:
- 遍历key:set.keys(),返回键名的遍历器
- 遍历value:set.values(0,返回键值的遍历器
- 遍历键值对:set.entries(),返回键值对儿的遍历器
- 使用回调函数遍历每个元素:forEach,没有返回值
由于Set结构没有键,只有值,或者说键和值是用一个,所以keys和values方法可以理解为一样的
const set = new Set(["zhao", "qian", "sun", "li"]);
console.log(set.keys()); // [Set Iterator] { 'zhao', 'qian', 'sun', 'li' }
for (let item of set.keys()) {
console.log(item);
}
// zhao
// qian
// sun
// li
console.log(set.values()); // [Set Iterator] { 'zhao', 'qian', 'sun', 'li' }
for (let item of set.values()) {
console.log(item);
}
// zhao
// qian
// sun
// li
console.log(set.entries());
// [Set Entries] {
// [ 'zhao', 'zhao' ],
// [ 'qian', 'qian' ],
// [ 'sun', 'sun' ],
// [ 'li', 'li' ]
// }
for (let item of set.entries()) {
console.log(item);
}
// [ 'zhao', 'zhao' ]
// [ 'qian', 'qian' ]
// [ 'sun', 'sun' ]
// [ 'li', 'li' ]
for (let i of set) {
console.log(i);
}
// zhao
// qian
// sun
// li
set.forEach((value, key) => {
console.log(value, key);
});
// zhao zhao
// qian qian
// sun sun
// li li
遍历Set的应用
- 用扩展运算符展开成一个数组
- 扩展运算符结合Set实现数组去重
- 结合数组的map、filter方法实现并集、交集、差集等
还是基于上面的例子:
console.log(set); // Set { 'zhao', 'qian', 'sun', 'li' }
console.log([...set]); // [ 'zhao', 'qian', 'sun', 'li' ]
console.log(typeof set); // object
console.log(typeof [...set]); // object
console.log(set instanceof Object); // true
console.log([...set] instanceof Array); // true
// 数组去重
let array = [1, 2, 1, 2, 3, 4, 5, 3];
let arr1 = [...new Set(array)];
console.log(arr1); // [ 1, 2, 3, 4, 5 ]
const arr2 = arr1.map(item => item * 2);
console.log(arr2); //[ 2, 4, 6, 8, 10 ]
const arr3 = arr1.filter(item => item > 3);
console.log(arr3); // [ 4, 5 ]
const a = new Set([1, 2, 3]);
const b = new Set([3, 4, 5]);
const union = [...new Set([...a, ...b])];
console.log(union); // [ 1, 2, 3, 4, 5 ]
const intersect = [...a].filter(item => b.has(item));
console.log(intersect); // [ 3 ]
const difference_a = [...a].filter(item => !b.has(item));
const difference_b = [...b].filter(item => !a.has(item));
console.log(difference_a); // [ 1, 2 ]
console.log(difference_b); // [ 4, 5 ]