ES6中的Set

今天面试的时候,面试官问我,有没有用过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的实例下有两个属性:

  1. constructor :构造函数
  2. size: 表示Set中含有的元素的个数

Set的操作方法

  1. 新增:add(),返回Set结构本身
  2. 删除:delete(),返回是否删除成功的布尔值
  3. 清除:clear(),无返回值
  4. 判断元素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的遍历方法:

  1. 遍历key:set.keys(),返回键名的遍历器
  2. 遍历value:set.values(0,返回键值的遍历器
  3. 遍历键值对:set.entries(),返回键值对儿的遍历器
  4. 使用回调函数遍历每个元素: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的应用

  1. 用扩展运算符展开成一个数组
  2. 扩展运算符结合Set实现数组去重
  3. 结合数组的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 ]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值