定义:Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
语法:
new Set([iterable]);
参数:
iterable
如果传递一个可迭代对象,它的所有元素将不重复地被添加到新的 Set中。如果不指定此参数或其值为null,则新的 Set为空。
返回值
一个新的Set对象。
set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
{
let list = new Set();
list.add(5);
list.add(7);
//获取list的元素数量
//size类似数组的length
console.log('size',list.size); //size 2
console.log('set-list',list); //{5, 7}
}
{
let arr = [1,2,3,4,5];
let list = new Set(arr);
console.log('size',list.size); //size 5
console.log('set-list',list); //{1, 2, 3, 4, 5}
}
{
let obj = {a:2,b:3};
let list = new Set();
list.add(obj);
obj['a'] = 4; //修改
console.log('set-list-obj',list); //{{[{a:4,b:3}]}}
}
{
let list = new Set();
list.add(1);
list.add(2);
list.add(1); //set添加重复元素不会报错,但不生效 ——应用:数组去重
console.log('list',list); //{1, 2}
let arr = [1,2,3,1,2,4];
let list2 = new Set(arr);
//将数组重复的元素过滤!
console.log('unique',list2); //{1, 2, 3, 4}
//set不做数据类型转换,2和'2'数据类型不一样
let arr1 = [1,2,3,1,'2',4];
let list3 = new Set(arr1);
console.log('unique',list3); //{1, 2, 3,'2', 4}
}
set实例的方法
//set实例的方法
{
let arr = ['add','delete','clear','has'];
let list = new Set(arr);
//has 判断set中有没有指定的元素
console.log('has',list.has('add')); //true
//delete 删除指定的元素
console.log('delete',list.delete('add'),list); //true {"delete", "clear", "has"}
//clear 清空整个set
list.clear();
console.log('list',list); // {}
}
set 遍历
set是一组key的集合 但不存储vaule,遍历处理的key和value是一样的 在Set中,没有重复的key。
//set 遍历 set是一组key的集合 但不存储vaule,遍历处理的key和value是一样的 在Set中,没有重复的key。
{
let arr = ['add','delete','clear','has',{last:2}];
let list = new Set(arr);
console.log('set-list',list); //{"add", "delete", "clear", "has", {…}}
for(let key of list.keys()){
console.log('keys',key); //value add, value delete, value clear, value has, keys {last: 2}
}
for(let value of list.values()){
console.log('value',value); //value add, value delete, value clear, value has, value {last: 2}
}
for(let [key,value] of list.entries()){
//这里可以看出set中的key和value是一样的
console.log('entries',key,value); //entries add add, entries delete delete, entries clear clear, entries has has, entries {last: 2} {last: 2}
}
list.forEach(function(item){
console.log(item); //add delete clear has {last: 2}
})
}
set应用
- 数组去重
//数组去重
{
let arr = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5];
let list = new Set(arr);
console.log(list); //{2, 3, 4, 5, 6, 7, 32}
}
{
console.log(new Set([2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5])); //{2, 3, 4, 5, 6, 7, 32}
}
//转化为Array
{
const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5];
console.log([...new Set(numbers)]); //[2, 3, 4, 5, 6, 7, 32]
}
- 交集 并集 差集
//intersect可以通过
{
let set1 = new Set([1,2,3,4,5,6,7,8]);
let set2 = new Set(['a','b','c',1,2,3,4]);
var intersection = new Set([...set1].filter(x => set2.has(x)));
//使用[...]扩展运算符将对象转化为数组
var intersectionArray = [...new Set([...set1].filter(x => set2.has(x)))];
// difference不通过
var difference = new Set([...set1].filter(x => !set2.has(x)));
//使用[...]扩展运算符将对象转化为数组
var differenceArray = [...new Set([...set1].filter(x => !set2.has(x)))];
console.log('交集',intersection); //{1, 2, 3, 4}
console.log('交集-数组形式',intersectionArray); //[1, 2, 3, 4]
console.log('差集',difference); //{5, 6, 7, 8}
console.log('差集-数组形式',differenceArray); //[5, 6, 7, 8]
}
{
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var union = new Set([...a, ...b]); // {1, 2, 3, 4} 并集
}
- Array相关
{
var myArray = ["value1", "value2", "value3"];
// 用Set构造器将Array转换为Set
var mySet = new Set(myArray);
console.log(mySet.has("value1")); // returns true
// 用...(展开操作符)操作符将Set转换为Array
console.log([...mySet]); // 与myArray完全一致
}
- String相关
{
var text = 'Indiana';
var mySet = new Set(text); // Set {'I', 'n', 'd', 'i', 'a'}
console.log(mySet.size); // 5
}
WeakSet对象与Set对象的区别
//WeakSet对象与Set对象的区别
//1. weakset的数据类型只支持对象,weakset的对象是弱引用
//2. set的一些属性和方法weakset是没有的
{
let weakList = new WeakSet();
let arg = {a:'1',b:'2'};
weakList.add(arg); //weakset的数据类型只支持对象!!
// WeakSet.clear(); 报错 没有该方法
// weakList.add(2); //报错
//weakset不支持 clear()方法 没有 sizes属性 不能遍历!!
console.log('weakList',weakList); //weakList WeakSet {Object {}}
}