ES6引入了一个新的数据结构类型:Set。而Set与Array的结构是很相似的,且Set和Array能够相互进行转换。数组
特色:只有属性值,成员值惟一(不重复)。数据结构
回忆数组:函数
使用构造函数建立数组 spa
var arr = new Array(); //建立一个空数组
var arr1 = new Array(10) //建立一个length为10的数组
var arr2 = new Array("red","blue","yellow") //建立了一个包含3个字符串的数组
arr.push(6) //向arr数组中添加一个数字6,该方法返回数组长度。
console.log(arr.length) //返回数组长度
建立set实例:code
建立set的实例一样须要使用Set构造函数,而且传入的参数必须只能是可迭代对象(带Symbol(Symbol.iterator)属性的对象)例如数组,字符串,在ES6...运算符中说起过,返回给你一个去重后的集合。orm
let oS = new Set(); //建立一个空set
let oS1 = new Set(['a',1,8,6,1,true]); //Set(5) {"a", 1, 8, 6, true}
let oS2 = new Set('abcdeab'); //Set(5) {"a", "b", "c", "d", "e"}
在Es5中实现去重须要咱们手写一个方法。对象
for(var i = 0; i < arr.length; i++){
if(!obj[arr[i]]){
newarr.push(arr[i]);
obj[arr[i]] = true;
}
}
consoel.log(newarr);
利用对象属性不重复咱们能够实现数组的去重。可是咱们发现手写的数组去重是不能实现对象去重的。blog
obj[{name:'z'}] = 5
console.log(obj)
{[object Object]: 5}
var o = {name:'zwq',age:18}
obj.ooo = 100
obj
{2,3: 5, [object Object]: 5, ooo: 100}
当以对象直接做为对象的属性时,因为对象的属性时字符串,他会本身调用toString()方法。而对象{}[toString()]返回的是这个["[object Undefined]"],不过是能够处理数组的,由于数组[2,3][toString()]返回的是"2,3",因此是能够去重的。字符串
使用set去重就能够实现对象的去重。而且直接调用就能够返回去重后的数据集合。可是set无数值名,当使用delete方法时,对象要用变量保存起来,不然没法删除。it
var oS = new Set(arr);
console.log([...oS]);
set的方法
添加
let oS = new Set([1]);
oS.add(2);
oS.add([1,2]);
oS.add(true);
console.log(oS); //Set(4) {1, 2, Array(2), true}
删除
oS.delete(2);
console.log(oS); //Set(3) {1, Array(2), true}
//删除数组,数组要提早用变量保存起来,不然直接oS.delete([1,2])是删不掉的,由于每个数组都是不同的。
清空整个set集合
oS.clear();
console.log(oS); //Set(0) {}
检测set集合是否存在某个值
oS.has(true) //true
//一样,在检测数组对象是都要用变量保存起来,要否则是找不到他的引用的。
因为set集合没有属性名,只有属性值,所以若是咱们行操做某个值能够遍set集合。
遍历set集合。
oS.forEach(val=>{
console.log(val);
})
也可使用ES6新增的for of 遍历。但这个遍历必须是一个可迭代对象,也就是说这个for of能够遍历set map 数组 字符串,可是不能够遍历对象,由于对象不是可迭代对象。
for(let prop of oS){
console.log(prop); //1 [1,2] true
}
for(let prop of [1,2]){
console.log(prop); // 1 2
}
for(let prop of "dsfdf"){
console.log(prop); // d s f d f
}
set集合能够转换成数组,方法一使用ES6给Array扩展到的方法form
Array.form()参数一样必须是可迭代对象。返回一个数组。
let arr = [1,2,4,1,3];
let Ab = new Set(arr);
console.log(Array.from (Ab)); //[1,2,4,3]
console.log(Array.from('1235')); //["1","2","3","5"]
方法二:使用...运算符,由于...运算符能够展开可迭代对象
console.log([...Ab]); //[1,2,4,3];
利用set使用数组的并集,交集,差集
并集
let arr1 = [1, 2, 3, 2, 3];
let arr2 = [3, 2, 4, 4, 5];
// 并集
let newArr = [...arr1,...arr2];
let oS = new Set(newArr);
console.log(oS); //Set(5) {1, 2, 3, 4, 5}
交集
let set1 = new Set(arr1);
let set2 = new Set(arr2)
let newArr = [...set1].filter(ele => set2.has(ele)) //使用数组的过滤方法filter
console.log(newArr); [2,3]
差集
let set1 = new Set(arr1);
let set2 = new Set(arr2)
let newArr1 = [...set1].filter(ele => {!set2.has(ele))
let newArr2 = [...set2].filter(ele => {!set1.has(ele))
let newArr = [...newArr1,...newArr2];
console.log(newArr); //[1,4,5]