Map 和 Set 是 ES6 新加入的資料結構,Map 很像物件,因為它們可以將一個鍵對應到一個值,Set 很像陣列,但它無法被複製。

Map

在 ES6 之前,當你需要將鍵對應到值的時候,會使用物件,因為物件可以讓鍵對應到各種型態的物件值,可是這樣使用物件會有許多缺點:

  • 因為物件的原型特性,代表你有可能會對應到意外的東西。
  • 你不容易知道一個物件裡面有多少對應
  • 鍵必須是字串或符號,讓你無法將物件對應到值
  • 物件不保證特性的順序

 

Map 物件可以解決這些缺點,而且很適合將鍵對應到值,比如說想要將使用者物件對應到角色:

const u1={name: 'John'}
const u2={name: 'Tom'}
const u3={name: 'Mary'}

建立 map

const userRoles= new Map();

 

使用 map 的 set() 來指派角色給使用者。

userRoles.set(u1, 'User')
userRoles.set(u2, 'User')
userRoles.set(u3, 'Admin')

 

也可以鏈結

userRoles.set(u1, 'User')
.set(u2, 'User')
.set(u3, 'Admin')

 

也可以傳遞陣列的陣列給建構式

const userRoles= new Map([
  [u1, 'User'],
  [u2, 'User'],
  [u3, 'Admin']
]);

 

如果想要知道 u2 角色是什麼,可以使用 get() 方法

userRoles.get(u2); //User

 

也可以透過 has() 方法來判斷是否有某個鍵

userRoles.has(u2) //true

 

要修改某個鍵的值則是用以下寫法:

userRoles.get(u1); //User
userRoles.set(u1, "Admin");  
userRoles.get(u1); //Admin

 

size 特性可以回傳 map 內的項目數量

userRoles.size; //3

 

使用 keys() 方法來取得 map 內的鍵,values() 回傳值,entries() 取得項目陣列。

for(let u of userRoles.keys()){
  console.log(u.name)
}

 

for(let r of userRoles.values()){
  console.log(r)
}

 

for(let ur of userRoles.entries()){
  console.log(`${ur[0].name}: ${ur[1]}`)
}

使用解構

for(let [u, r] of userRoles.entries()){
  console.log(`${u.name}: ${r}`)
}

 

要刪除 map 的一個項目,可以使用 detele() 方法

userRoles.delete(u2)

要刪除 map 的所有項目,可以使用 clear() 方法

userRoles.clear()

 

Set

set 是一組不重複的資料,在之前的範例中,我們可能想要賦與一個使用者多個角色,比如所有使用者都有 User 角色,但如果有 Admin 角色的同時也會有 User 角色,這時候就可使用 set。

首先建立一個 Set 實例:

const roles=new Set();

 

如果想要替一個使用者增加角色,可以使用 add() 方法:

roles.add("User")

再增加管理員的角色

roles.add("Admin")
roles.size; //2

 

要刪除角色的話使用 delete() 方法

roles.delete("Admin")