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]