ES6
提供了一个新的数据结构 Set
,它和 Array
的构造很相似,然而 Set
中成员的值都是惟一的,没有反复的值。
创立 Set
Set
对象能够存储任何类型的惟一值,无论是原始值或者是对象援用。创立 Set
的实例须要用到 Set
构造函数,并且传入的参数必须只能是可迭代对象,例如数组,字符串
示例:
创立一个空的 set
:
let set1 = new Set();
console.log(set1);
// 输入: Set {}
创立并初始化一个 set
let set2 = new Set([1, 2, 3, 2, 1]);
console.log(set2);
// 输入: Set {1, 2, 3}
上述代码中,表名 Set
中的值必须是惟一的,不容许反复。
Set 的办法和属性
add()办法
add()
办法用于向 Set
中增加元素,返回一个新的 Set
。
示例:
例如咱们能够向 Set
中增加不同类型的值:
let set1 = new Set();
set1.add(1);
set1.add('xkd');
console.log(set1);
// 输入: Set {1, 'xkd'}
delete()办法
delete()
办法用于删除 Set
中的元素,返回一个布尔值,判断是否删除胜利。如果删除胜利返回 true
,删除失败返回 false
。
示例:
删除 Set
中的指定元素:
let set1 = new Set([1, 2, 3, 4, 5]);
console.log(set1.delete(4)); // 输入:true
console.log(set1); // 输入:Set {1, 2, 3, 5}
如果指定的元素在 Set
中不存在,则返回 false
,示意删除失败:
console.log(set1.delete(10)); // 输入:false
has()办法
has()
办法用于判断某个值是否为 Set
的成员,返回一个布尔值。
示例:
let set1 = new Set([1, 2, 3, 4, 5]);
console.log(set1.has(2)); // 输入:true
console.log(set1.has(7)); // 输入:false
上述代码中,2
是 set1
中的成员,所以返回 true
,而 7
不是所以返回 false
。
clear()办法
clear()
办法用于清空 Set
中的全副成员。
示例:
let set1 = new Set([1, 2, 3, 4, 5]);
set1.clear();
console.log(set1); // 输入:Set {}
size 属性
size
属性返回以后 Set
元素总数。
示例:
let set1 = new Set([1, 2, 3, 4, 5]);
console.log(set1.size); // 输入:5
Set 遍历操作
Set
构造的实例有四个遍历办法,能够用于遍历 Set
中的成员。咱们一起来看一下。
keys()办法
keys()
办法是用于返回键名的遍历器。
示例:
let set_k = new Set(['xkd', 'Iven', 'summer']);
console.log(set_k.keys());
// 输入: [Set Iterator] {'xkd', 'Iven', 'summer'}
values()办法
values()
办法是用于返回键值的遍历器。
示例:
let set_v = new Set(['xkd', 'Iven', 'summer']);
console.log(set_v.values());
// 输入: [Set Iterator] {'xkd', 'Iven', 'summer'}
因为 Set
构造没有键名,只有键值,或者说键名和键值是同一个,所以 keys
办法和 values
办法的行为完全一致。
entries()办法
entries()
办法是用于返回键值对的遍历器。
示例:
let set_e = new Set(['xkd', 'Iven', 'summer']);
console.log(set_e.entries());
输入:
[Set Entries] {[ 'xkd', 'xkd'],
['Iven', 'Iven'],
['summer', 'summer']
}
forEach()办法
forEach()
办法应用回调函数遍历每个成员。
示例:
let set_f = new Set(['xkd', 'Iven', 'summer']);
set_f.forEach(function(value,key){console.log(value+":"+key);
})
输入:
xkd:xkd
Iven:Iven
summer:summer
forEach
办法的参数就是一个回调函数,该函数的参数与数组的 forEach
统一,顺次为键值、键名、汇合自身。这里须要留神,Set
构造的键名就是键值因而第一个参数与第二个参数的值永远都是一样的。
forEach
办法还能够有第二个参数,示意绑定处理函数外部的 this
对象。
Set 对象的作用
- 去重
let set1 = new Set([1, 2, 3, 4, 2, 4]);
console.log(set1); // Set {1, 2, 3, 4}
- 并集
var set1 = new Set([1, 2, 3]);
var set2 = new Set([7, 6, 1]);
var union = new Set([...set1, ...set2]);
console.log(union); // 输入:Set {1, 2, 3, 7, 6}
- 交加
var set1 = new Set([1, 2, 3]);
var set2 = new Set([7, 6, 1]);
let inter = new Set([...set1].filter(x=>set2.has(x))) //{4,5}
console.log(inter); // 输入:Set {1}
- 差集
var set1 = new Set([1, 2, 3]);
var set2 = new Set([7, 6, 1]);
var diff = new Set([...set1].filter(x => !set2.has(x))); // {1}
console.log(diff); // 输入:Set {2, 3}
Set 类型转换
Set
类型的值能够和其余数据类型的值进行类型转换,咱们来看一下。
Array
转为Set
:
let arr1 = ["x", "k", "d"];
let set1 = new Set(arr1);
console.log(set1); // 输入:Set {'x', 'k', 'd'}
Set
转为Array
:能够通过扩大运算符...
来实现。
let set1 = new Set(["x", "k", "d"]);
var arr1 = [...set1];
console.log(arr1); // 输入:['x', 'k', 'd']
String
转为Set
:
let set1 = new Set('xkd');
console.log(set1); // 输入:Set {'x', 'k', 'd'}
留神 Set
中的 toString
办法是不能将 Set
转换成 String
类型的。