Set数据结构
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 Set 本身是一个构造函数,用来生成 Set 数据结构
Set的基本用法
数组是一系列有序的数据集合 [1,3,5,3] Set是一系列无序、没有重复值得数据集合 [1,3,5]
Set没有下标去表示每一个值,所以Set是无序的,,也不能像数组那样通过下标去访问Set的成员
//创建数组的方式 console.log([1,2,3]); console.log(new Array(1,2,3)) //创建set集合 const s = new Set(); s.add(12); s.add(34); s.add(34);//重复的数据添加不进去 console.log(s);
Set实例的方法和属性
Set 结构的实例有以下属性
1、Set.prototype.constructor :构造函数,默认就是 Set 函数。
2、Set.prototype.size :返回 Set 实例的成员总数。
Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。
四个操作方法:
1、Set.prototype.add(value) :添加某个值,返回 Set 结构本身。
2、Set.prototype.delete(value) :删除某个值,返回一个布尔值,表示删除是否成功。
3、Set.prototype.has(value) :返回一个布尔值,表示该值是否为 Set 的成员。
4、Set.prototype.clear() :清除所有成员,没有返回值。
const s=new Set();//构造函数创建对象
s.add(1).add(2).add(2);//s: 1 2 // 注意2被加入了两次
s.size // 2 s.has(1) // true 判断是否有某个成员
s.has(2) // true s.has(3) // false
s.delete(2);//删除指定成员 如果删除不存在的成员不会报错
s.has(2) // false
s.clear()//清空成员
遍历操作
Set 结构的实例有四个遍历方法,可以用于遍历成员。
1、Set.prototype.keys() :返回键名的遍历器
2、Set.prototype.values() :返回键值的遍历器
3、Set.prototype.entries() :返回键值对的遍历器
4、Set.prototype.forEach() :使用回调函数遍历每个成员
需要特别指出的是, Set 的遍历顺序就是插入顺序。这个特性有时非常有用,比如使用 Set 保存一个回 调函数列表,调用时就能保证按照添加顺序调用
- keys() , values() , entries()
let set = new Set([‘red’, ‘green’, ‘blue’]);
//keys 键名的遍历器
for (let item of set.keys()) { console.log(item);// // red // green // blue }
//values 键值的遍历器 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”] } - forEach()
Set 结构的实例与数组一样,也拥有 forEach 方法,用于对每个成员执行某种操作,没有返回值。 forEach 方法的参数就是一个处理函数。该函数的参数与数组的 forEach 一致,依次为键值、键 名、集合本身(上例省略了该参数)。这里需要注意,Set 结构的键名就是键值(两者是同一个 值),因此第一个参数与第二个参数的值永远都是一样的。
let set = new Set([1, 4, 9]); set.forEach((value, key) => console.log(key + ’ : ’ + value)) // 1 : 1 // 4 : 4 // 9 : 9
forEach中this的指向
let s = new Set([1, 3, 4, 5, 6])
s.forEach(function (value, key, set) { // Set 中 value = key
console.log(value, key, set === s);
console.log(this);//forEach不传入第二个参数,this指向的是window对象。如果传入参 数,this指向的是传入的对象 }, document);
console.log(s);
Set构造函数的参数
- 数组、字符串、arguments、NodeList、Set等
const set1 = new Set([1, 2, 4]); const set2 = new Set(‘helloworld’);
const set3 = new Set(set1); console.log(set3)
console.log(set3 === set1);//false
Set的注意事项 - 判断重复的方式
Set对重复的值得判断基本遵循严格相等(=)
但是对于NaN的判断与=不同,Set中的NaN等于NaN
const s = new Set([2, 4, 2]); console.log(s);// 2 4 console.log(NaN === NaN);//false
///Set中的NaN等于NaN const s1 = new Set([NaN, 4, NaN]);//NaN 4 console.log(s1) - 2.什么时候使用Set
数组或字符串中去重
不需要通过下标访问,只需要遍历时
为了使用Set提供的方法和属性时(add delete clear has forEach size)
Set的应用 - 数组去重
// 去除数组的重复成员 const items = […new Set([1, 2, 3, 4, 5, 5, 5, 5])];
//Array.from方法可以将 Set 结构转为数组。 const item = new Set([1, 2, 3, 4, 5]); const array = Array.from(item); - 字符串去重
const s = new Set(‘helloworld’); console.log([…s].join(‘’));
// 字符串去重 //去除字符串里面的重复字符
[…new Set(‘ababbc’)].join(‘’);// “abc” - 存放DOM元素//存放DOM元素 const elems=new Set(document.querySelectorAll(“p”)); console.log(elems) elems.forEach(function(ele){ ele.style.color = ‘red’; })