ES6扩展:Set数据结构
一、Set的定义
数组:一系列有序的数据集合
Set :一系列无序、没有重复值的数据集合
const s = new Set();
s.add(1); // Set(1) {1}
s.add(2); //Set(2) {1, 2}
s.add(1); //Set(2) {1, 2} //没有重复值
Set 没有下标去标示每一个值,所以 Set 是无序的,也不能像数组那样通过下标去访问 Set 的成员
二、Set 实例的方法
1、add 添加某个值,返回 Set 结构本身。
const s = new Set();
s.add(1).add(2).add(2);
console.log(s); // Set(2) {1, 2}
2、has 返回一个布尔值,表示该值是否为Set的成员。
console.log(s.has(1)); //tuue
3、delete 删除某个值,返回一个布尔值,表示删除是否成功。
s.delete(3);
4、clear 清除所有成员,没有返回值。
s.clear();
5、forEach 可进行遍历:按照成员添加进集合的顺序遍历
let set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key , value))
//1 1
//4 4
//9 9
forEach
方法的参数就是一个处理函数。依次为键值、键名、集合本身(上例省略了该参数)。这里需要注意,Set 结构的键名就是键值(两者是同一个值),因此第一个参数与第二个参数的值永远都是一样的。
另外,forEach方法还可以有第二个参数,表示绑定处理函数内部的this对象。
三、Set 实例的属性
size :返回长度
console.log(s.size);
四、Set 构造函数的参数
1、数组
const s = new Set([1, 2, 1]);
console.log(s); //Set(2) {1, 2}
2、字符串、arguments、NodeList、Set 等
console.log(new Set('hi'));//Set(2) {'h', 'i'}
function func() {
console.log(new Set(arguments));
}
func(1, 2, 1);
//Set(2) {1, 2}
const s = new Set([1, 2, 1]);
console.log(new Set(s) === s);
console.log(s);
//false
// Set(2) {1, 2} 相当于进行了复制
五、Set 的注意事项
1、判断重复的方式
Set 对重复值的判断基本遵循严格相等(===)
但是对于 NaN 的判断与 === 不同,Set 中 NaN 等于 NaN
console.log(NaN === NaN); //false
const s = new Set([NaN, 2, NaN]);
console.log(s); //Set(2) {NaN, 2} Set 中 NaN 等于 NaN
2、什么时候使用 Set
① 数组或字符串去重时
② 不需要通过下标访问,只需要遍历时
③ 为了使用 Set 提供的方法和属性时(add delete clear has forEach size 等)
六、Set 的应用
1、数组去重
//[1, 2, 1];
const s = new Set([1, 2, 1]);
console.log(s);
//将s再次成为数组
//1)s.forEach进行遍历
//2)展开运算符console.log([...new Set([1, 2, 1])]); //(2) [1, 2]
2、字符串去重
//'abbacbd';
const s = new Set('abbacbd');
console.log([...s].join('')); //先转化为数组,再使用join方法
console.log(s); //abcd
//一步到位
console.log([...new Set('abbacbd')].join(''));
3、存放 DOM 元素
const s = new Set(document.querySelectorAll('p'));
s.forEach(function (elem) {
// console.log(elem);
elem.style.color = 'red';
elem.style.backgroundColor = 'yellow';
});