ES6提供新的數據結構Set,相似於數組,可是成員的值是惟一的,沒有重複值。也就是說Set是不重複的值的集合es6
沒有鍵名,只有鍵值,或說鍵名和鍵值是同一個值,兩個值永遠是相等的數組
接受一個數組做爲參數,用來初始化markdown
const set = new Set([1,2,3,4,4]);
consle.log(set);//[1,2,3,4]
console.log([...set]);//[1,2,3,4]
複製代碼
.add( ) 添加某一個值,返回的是Set結構自己數據結構
.delete( ) 刪除某個值,返回一個布爾值,表示刪除是否成功函數
.has( ) 返回一個布爾值,表示該值是否爲Set的成員oop
.clear( ) 清除全部成員,沒有返回值學習
由於Set沒有鍵名只有鍵值,或說鍵名和鍵值是同一個值,因此.values( )和.keys()行爲一致ui
Set結構的實例默承認遍歷,因此能夠省略.values方法;spa
let set = new Set(["red", "green", "blue"]);
for (let i of set.keys()) {
console.log("set.keys:", i);
}
let set2 = new Set(["red", "green", "blue"]);
for (let i of set2.values()) {
console.log("set.values:", i);
}
let set4 = new Set(["red", "green", "blue"]);
for (let i of set4) {
console.log("Set結構的實例默承認遍歷:", i);
}
複製代碼
Array.from方法能夠將 Set 結構轉爲數組3d
//實例1
const set = new Set([1, 2, 3, 4, 4]);
console.log(set);//[1,2,3,4]
//實例2
const items = new Set([1, 2, 3, 4, 4, 5, 6, 6]);
const array = Array.from(items);//[1,2,3,4,5,6]
//實例3
function unique(array){
//判斷是否是數組,不是就直接return
if (!(arr instanceof Array)) {
console.log("傳入的不是數組");
return
} else {
return Array.from(new Set(array));//Array.from方法能夠將Set結構轉爲數組
}
}
unique([1,1,2,3]);//[1,2,3]
unique('111');//傳入的不是數組
複製代碼
注意:Set該方法只針對通常數組,好比[1, 2, 3, 4, 4]這種,若是數組裏面還有對象,該方法不適用,好比 [{a: 1} , {a: 1} , {a: 2}]這種。
const str = "ascddsdfg";
const DEPLICATE_STR = new Set(str);
console.log([...DEPLICATE_STR].join(''));//ascdfg
複製代碼
join( )將數組中的全部元素轉換成一個字符串;
數組的map和filter方法能夠間接用於Set,Set自己沒有map和filter方法的哦~
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
let union = [...new Set([...a, ...b])];
console.log("並集=", union); //[1,2,3,4]
let intersect = [...new Set([...a].filter((x) => b.has(x)))];
console.log("交集=", intersect); //[2,3]
let difference = Array.from(new Set([...a].filter((x) => !b.has(x))));
console.log("差集=", difference); //[1]
複製代碼
WeakSet和Set的區別:
都是不可重複值的集合
成員只能是對象
沒有size屬性,不可遍歷
用處:
WeakSet的一個用處,是儲存DOM節點,而不擔憂這些節點從文檔移除時,會引起內存泄漏;
本質上是健值對的集合,相似集合;
傳統鍵值對都是「字符串-值」的對應,有所限制,因此Map結構提供了「值-值」的對應;
能夠遍歷,能夠跟各類數據格式轉換
接受一個數組做爲參數,數組成員是一個個表示鍵值對的數組;
Set和Map均可以生成新的Map;
只有對同一個對象的引用,Map 結構纔將其視爲同一個鍵;
Map 的鍵其實是跟內存地址綁定的,只要內存地址不同,就視爲兩個鍵。
const map = new Map();
map.set(['aaa',5]);
console.log(map.get(['aaa']));//undefined
//只有對同一個對象的引用,Map 結構纔將其視爲同一個鍵;因此必需要指向同一個對象,將其存爲一個對象;
const map = new Map();
const k1 = ['aaa'];
map.set(k1,5);
console.log(map.get(k1));//5
複製代碼
.set( )
.get( )
.delete( )
.has( )
.clear( )
.keys( ) 返回鍵名的遍歷器
.values( ) 返回鍵值的遍歷器
.entries( ) 返回全部成員的遍歷器
forEach( ) 遍歷Map的全部成員
Map的遍歷順序就是插入的順序
//一、Map轉數組
const map0 = new Map().set(1,'a').set(2,'b');
console.log(":",[...map0]);//[{1,'a'},{2,b}]
console.log("Map轉數組:",[...map0].keys());//[1,2]
console.log("Map轉數組:",[...map0].values());//['a','b']
//二、數組轉Map,將數組直接傳入Map構造函數
new Map([
[true,7],
[{foo:3},['abc]] ]) //三、Map轉對象 const map1 = new Map().set(1,'a').set(2,'b'); function strMapToObj(strMap){ let obj = Object.create(null);//建立一個空對象,這樣建立的對象乾淨,除了自身屬性以外沒有其餘屬性和方法 for(let [k,v] of strMap){ obj[k] = v; } return obj } strMapToObj(map1); //四、對象轉數組 const obj1 = {1:'a',2:'b'} let map2 = new Map(Object.entries(obj))//Object.entries()返回一個給定對象自身可枚舉屬性的鍵值對數組[['1','a'],['2','b']] 複製代碼
可使用數組的map和filter方法,Map自己是沒有map和filter方法的
const map0 = new Map().set(1,'a).set(2,'b).set(3,'c');
const map1 = new Map([...map0].filter(([k,v])=>k < 3));
const map2 = new Map([...map0].map(([k,v])=>[k*2,'_'+v]))
複製代碼
(也就是說一旦不須要了,WeakMap裏面的鍵名對象和所對應的鍵值對就會自動消失,不用手動刪除)
(注意:弱引用的只是鍵名,而不是鍵值,鍵值依然是正常引用)
WeakMap的專用場合:
它的鍵所對應的對象,可能會在將來消失。
WeakMap結構有助於防止內存泄漏。
在API上的區別:
沒有遍歷操做,即沒有keys()、values()、entries()方法,也沒有size屬性;
沒法清空,即不支持clear()方法,所以WeakMap只有set( )、get( )、has( )、delete( )方法;
學習資料: