一、Set是一组唯一值的集合(没有键),它的每一个值只能出现一次,可以按照添加顺序来遍历。
二、Set的主要方法如下:
- new Set(iterable)—— 创建一个set,如果提供了一个iterable对象(通常是数组),将会从数组里面复制值到set中。
- set.add(value)—— 添加一个值,返回 set 本身
- set.delete(value)—— 删除值,如果value在这个方法调用的时候存在则返回true,否则返回false。
- set.has(value)—— 如果value在 set 中,返回true,否则返回false。
- set.clear()—— 清空 set。
- set.size—— 返回元素个数。
【示例1】Set的基本操作
var mySet = new Set()
mySet.add(1)
mySet.add('some text')
mySet.add('foo')
mySet.has(1) // true
mySet.delete('foo')
mySet.size // 2
for (let item of mySet) {
console.log(item)
}
// 1
// 'some text'
三、Set的主要特点是,重复使用同一个值调用set.add(value)并不会发生什么改变。这就是Set里面的每一个值只出现一次的原因。
【示例1】我们有客人来访,我们想记住他们每一个人。但是已经来访过的客人再次来访,不应造成重复记录。每个访客必须只被“计数”一次。Set可以帮助我们解决这个问题:
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
// visits,一些访客来访好几次
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);
// set 只保留不重复的值
alert( set.size ); // 3
for (let user of set) {
alert(user.name); // John(然后 Pete 和 Mary)
}
1、Set的替代方法可以是一个用户数组,用arr.find在每次插入值时检查是否重复。但是这样性能会很差,因为这个方法会遍历整个数组来检查每个元素。Set内部对唯一性检查进行了更好的优化。
Set 迭代(iteration)
一、可以使用for…of 或 forEach(Set有内置的forEach方法)来遍历Set
二、如果要在Set里使用循环,可以使用以下三个方法
- set.keys()—— 遍历并返回所有的值(returns an iterable object for values),
- set.values()—— 与set.keys()作用相同,这是为了兼容Map,
- set.entries()—— 遍历并返回所有的实体(returns an iterable object for entries)[value, value],它的存在也是为了兼容Map。
【示例1】
let set = new Set(["oranges", "apples", "bananas"]);
for (let value of set) alert(value);
// 与 forEach 相同:
set.forEach((value, valueAgain, set) => {
alert(value);
});
1、forEach的回调函数有三个参数:一个value,然后是同一个值valueAgain,最后是目标对象。没错,同一个值在参数里出现了两次。
2、forEach的回调函数有三个参数,是为了与Map兼容。当然,这看起来确实有些奇怪。但是这对在特定情况下轻松地用Set代替Map很有帮助,反之亦然。
Array与Set
Array和Set的对比
一、一般情况下,在JavaScript中使用数组来存储一组元素,而新的集合对象有这些优势:
1、数组中用于判断元素是否存在的indexOf 函数效率低下。
2、Set对象允许根据值删除元素,而数组中必须使用基于下标的 splice 方法。
3、数组的indexOf方法无法找到NaN值。
4、Set对象存储不重复的值,所以不需要手动处理包含重复值的情况。
数组和集合的转换
一、可以使用Array.from或展开操作符来完成集合到数组的转换。
Array.from(mySet)
[...mySet2]
二、Set的构造函数接受数组作为参数,可以完成从Array到Set的转换。
1、Set对象中的值不重复,所有数组转换为集合时,所有重复值将会被删除。
mySet2 = new Set([1, 2, 3, 4])