集合
集合(set)是在ES6中引入的一種數據結構,用於表示唯一值的集合,所以它不能包含重復值。接 下來這一小節,就讓我們具體來看一下這種新的數據結構。
Set集合是一種無重復元素的列表,這是這種數據結構的最大的一個特點。
要創建一個集合,方法很簡單,直接使用new就可以創建一個Set對象。如果想要集合在創建時 就包含初始值,那么我們可以傳入一個數組進去。
let s1 = new Set();
let s2 = new Set([1,2,3]);
console.log(s1);//Set {}
console.log(s2);//Set { 1, 2, 3 }
使用add()方法可以給一個集合添加值,由於調用add()方法以后返回的又是一個Set對象,所 以我們能連續調用add()方法進行值的添加,這種像鏈條一樣的方法調用方式被稱為鏈式調用。
let s1 = new Set();
s1.add(1);
console.log(s1);//Set { 1 }
s1.add(2).add(3).add(4);
console.log(s1);
//Set { 1, 2, 3, 4 } 我們還可以直接將一個數組傳入add()方法里面 let s1 = new Set();
s1.add([1,2,3]);
console.log(s1);
//Set { [ 1, 2, 3 ] }
需要注意的是建立Set對象時傳入數組與調用add()方法時傳入數組是效果是不一樣,區別 如下:
建立Set對象時傳入數組,數組每一項成為Set對象的一個元素
let s1 = new Set([1,2,3]);
console.log(s1);
//Set { 1, 2, 3 }
console.log(s1.size);//3
調用add()方法時傳入數組,就是作為Set對象的一個元素
let s1 = new Set();
s1.add([1,2,3]);
console.log(s1);
//Set { [ 1, 2, 3 ] }
console.log(s1.size);//1
在Set對象中,不能夠添加相同的元素,這是很重要的一個特性
let s1 = new Set();
s1.add(1).add(2).add(2).add(3);
console.log(s1);
//Set { 1, 2, 3 }
集合相關屬性和方法
- 用size屬性獲取元素個數
let s1 = new Set([1,2,3]);
console.log(s1.size);//3
- 使用has()方法來查看一個集合中是否包含某一個值
let s1 = new Set([1,2,3]);
console.log(s1.has(1));//true
- 刪除集合值
使用delete刪除Set對象里面的某一個元素
let s1 = new Set([1,2,3]);
s1.delete(2);
console.log(s1);//Set { 1, 3 }
//沒有的元素也不會報錯
s1.delete("2");
console.log(s1);//Set { 1, 3 }
如果要一次性刪除所有的元素,可以使用clear方法
let s1 = new Set([1,2,3]);
s1.clear()
console.log(s1);//Set {}
遍歷集合
集合也是可以枚舉的,我們同樣可以使用for-o f來對集合進行遍歷,如下:
let s = new Set([1,2,3,4,5]);
for(let i of s){ console.log(i);
}
// 1
// 2
// 3
// 4
// 5
或者通過for Each來進行遍歷,示例如下:
//使用forEach進行遍歷
let s = new Set([1,2,3,4,5]); s.forEach(ele => console.log(ele));
//1
//2
//3
//4
//5
除此之外,我們也可以使用集合里面自帶的keys() , values()以及ent ries()方法來對集合 進行遍歷。順便要說一下的是,在集合里面鍵和值是相同的。
keys()方法遍歷集合的鍵
let s = new Set(["Bill","Lucy","David"]); for(let i of s.keys()){
console.log(i);
}
// Bill
// Lucy
// David
values()方法遍歷集合的值
let s = new Set(["Bill","Lucy","David"]); for(let i of s.values()){
console.log(i);
}
// Bill
// Lucy
// David
ent ries()方法同時遍歷集合的鍵與值
let s = new Set(["Bill","Lucy","David"]); for(let i of s.entries()){
console.log(i);
}
// [ 'Bill', 'Bill' ]
// [ 'Lucy', 'Lucy' ]
// [ 'David', 'David' ]
集合轉數組
集合轉為數組,最快的方法就是使用前面所講過的擴展運算符,如下:
let s1 = new Set([1,2,3]);
console.log(s1);//Set { 1, 2, 3 }
let arr = [...s1]; console.log(arr);//[ 1, 2, 3 ]
除此之外,我們還可以使用Arra y對象所提供的from。方法來進行轉換
let s1 = new Set([1,2,3]); console.log(s1);//Set { 1, 2, 3 }
let arr = Array.from(s1); console.log(arr);//[ 1, 2, 3 ]
前面我們有提到過,Set對象里面是不能夠存放相同的元素的,利用這個特性,我們可以快速的 為數組去重,如下:
let arr = [1,2,2,3,4,3,1,6,7,3,5,7];
let s1 = new Set(arr);
let arr2 = [...s1]; console.log(arr2);//[ 1, 2, 3, 4, 6, 7, 5 ]
弱集合(擴展)
當對象添加到集合中時,只要集合存在,它們就一直存儲在集合。即使對象的引用被刪除了也依 然如此,我們來看下面的這個例子:
let arr = [1,2,3];
let s = new Set(arr);
arr = null;//刪除arr數組的指向
console.log(s);//Set { 1, 2, 3 }數組依然存在於集合中 console.log(arr);//null
映射
映射(Map)也是ES6規范中引入的一種數據結構。
使用new關鍵字與Map()構造函數,就可以創建一個空的m ap對象。如果要向Map映射中添加 新的元素,可以調用set()方法並分別傳入鍵名和對應值作為兩個參數。如果要從集合中獲取 信息,可以調用get()方法。
let m = new Map();
m.set("name","xiejie");
m.set("age",18);
console.log(m);
//Map { 'name' => 'xiejie', 'age' => 18 }
console.log(m.get("name"));
//xiejie
在對象中,無法用對象作為對象屬性的鍵名。但是在Map映射中,卻可以這樣做,可以這么說, 在Map映射里面可以使用任意數據類型來作為鍵。
let m = new Map();
m.set({},"xiejie"); m.set([1,2,3],18);
m.set(3581,18);
console.log(m);
//Map { {} => 'xiejie', [ 1, 2, 3 ] => 18, 3581 => 18 }
傳入數組來初始化Map映射 可以向Map構造函數傳入一個數組來初始化Map映射,這一點同樣與Set集合相似。數組中的每 個元素都是一個子數組,子數組中包含一個鍵值對的鍵名與值兩個元素。因此,整個Map映射中 包含的全是這樣的兩個元素的二維數組
let arr = [["name","xiejie"],["age",18]];
let m = new Map(arr);
console.log(m);
//Map { 'name' => 'xiejie', 'age' => 18 }
映射相關屬性和方法
在設計語言新標准時,委員會為Map映射與Set集合設計了如下3個通用的方法 has(key):檢測指定的鍵名在Map映射中是否已經存在 delete(key):從Map映射中移除指定鍵名及其對應的值
clear。:移除M ap映射中的所有鍵值對
Map映射同樣支持size屬性,其代表當前集合中包含的鍵值對數量
let arr = [["name","xiejie"],["age",18]]; let m = new Map(arr);
console.log(m);//Map { 'name' => 'xiejie', 'age' => 18 } console.log(m.size);//2 console.log(m.has("name"));//true console.log(m.get("name"));//xiejie m.delete("name");
console.log(m);//Map { 'age' => 18 } m.clear();
console.log(m);//Map {}
映射的遍歷
與集合一樣,映射也是可以枚舉的,所以可以用與集合類似的方式進行遍歷。 使用for-of來遍歷映射
let m = new Map([["name","xiejie"],["age",18]]); for(let i of m){
console.log(i);
}
// [ 'name', 'xiejie' ]// [ 'age', 18 ]
keys()方法遍歷映射的鍵
let m = new Map([["name","xiejie"],["age",18]]); for(let i of m.keys()){
console.log(i);
}
// name
// age
values()方法遍歷映射的值
let m = new Map([["name","xiejie"],["age",18]]); for(let i of m.values()){
console.log(i);
}
// xiejie
// 18
ent ries()方法同時遍歷映射的鍵與值
let m = new Map([["name","xiejie"],["age",18]]); for(let i of m.entries()){
console.log(i);
}
// [ 'name', 'xiejie' ]
// [ 'age', 18 ]
映射轉為數組
Map結構轉為數組結構,比較快速的方法還是使用前面介紹過的擴展運算符...。
let arr = [["name","xiejie"],["age",18]];
let m = new Map(arr);
console.log([...m.keys()]);//[ 'name', 'age' ]
console.log([...m.values()]);//[ 'xiejie', 18 ]
console.log([...m.entries()]);//[ [ 'name', 'xiejie' ], [ 'age', 18 ] ]
console.log([...m]);//[ [ 'name', 'xiejie' ], [ 'age', 18 ] ] 或者使用Array對象的from。方法
let arr = [["name","xiejie"],["age",18]];
let m = new Map(arr);
console.log(Array.from(m));
//[ [ 'name', 'xiejie' ], [ 'age', 18 ] ]