ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。set本身是构造函数,用来生成set数据结构。
set的属性:
size;返回set实例的成员总数。
let set = new Set();
set.add(10).add(20).add(30);
console.log(set.size); //3
set的方法:
① add(value):添加某个值,返回set结构本身。
let set = new Set();
set.add(10).add(20).add(30).add(30);
console.log(set)//{10, 20, 30}
② delete(value):删除某个值,返回一个布尔值,表示是否删除成功。
let set = new Set();
set.add(10).add(20).add(30)
console.log(set.delete(10)); //true
③ has(value):返回一个布尔值,表示该值是否为Set的成员。
let set = new Set();
set.add(10).add(20).add(30)
console.log(set.has(10)); //true
④ clear():清除所有成员没有返回值。
let set = new Set();
set.add(10).add(20).add(30)
set.clear();
console.log(set); //{}
set构造函数支持参数,参数可以为数组。
let set = new Set([10,20,30]);
console.log(set)//{10, 20, 30}
数组去重:
Array.form方法可以将Set结构转为数组
Array.from() 方法从一个类似数组或可迭代的对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等) 中创建一个新的数组实例.
let uniqArr = arr => Array.from(new Set(arr));
let a = uniqArr([10, 20, 30, 10, 20, 30]);
console.log(a);// [10, 20, 30]
set的遍历
keys方法,values方法,entries方法返回的都是遍历器对象。
由于Set结构没有键名只有键值(或者说键名和键值是同一个值),所以keys()和values()是方法的行为完全一致。
1.遍历键keys( )
let os = new Set([1, 2, 3, 4, 5]);
let ks = os.keys();
for (let i of ks) {
console.log(i);
}
// 1
// 2
// 3
// 4
// 5
2.遍历值values( )
let os = new Set([1, 2, 3]);
let ks = os.values();
for (let i of ks) {
console.log(i);
}
// 1
// 2
// 3
3.遍历实体entries( )
下面代码中,entries方法返回的遍历器,同时包括键名和键值,所以每次输出的两个成员完全相等。
let os = new Set([1, 2, 3]);
for (let [key, value] of os.entries()) {
console.log(key,value);
}
// 1 1
// 2 2
// 3 3
4.forEach( )
关于箭头函数,详见es6常用特性——箭头函数
let os = new Set([1, 2, 3]);
os.forEach(item => void console.log(item));
// 1
// 2
// 3
5.for…of
set因为部署了iterator接口,所以可以被for…of遍历。
let os = new Set([1, 2, 3]);
for (let i of os) {
console.log(i)
}
// 1
// 2
// 3