javascript中的Map和Set

tracy丶傑發表於2017-12-08

在es6的新特性中,加入了Map和Set集合,是一種資料結構。

javascript中預設使用{}來表示一組鍵值對。

但是javascript的物件有個問題,key必須是字串型別的,其實上其他資料型別作為key也是合理的。

為了解決這個問題,es6中新增了Map。

如何宣告:

'use strict';
var a = new Map();
var s = new Set();
複製程式碼

#Map

舉個例子,假設要根據同學的名字查詢該同學的成績,如果用陣列實現,我們這麼寫:

var names = ["mickel", "bob", "tracy"];
var scores = [95, 97, 88];
複製程式碼

給定一個名字,要查詢某個同學的成績,就需要現在names陣列中找到對應的位置,然後在scores中取出對應的成績,陣列越長,耗時越長。

如果我們現在用Map實現,只需要一個“名字-成績”的對照表,不管這個表有多大,查詢速度都不會變慢。

var m = new Map([['mickel', 95],['bob', 97],['tracy', 88]]);
var tracyScore = m.get('tracy');
console.log(tracyScore); //88
複製程式碼

初始化Map需要一個二維陣列,或者直接初始化一個空的Map。Map具有以下方法:

var n = new Map();
n.set('adam', 80);
n.set('bob', 77);
console.log(n.has('adam')); //true
console.log(n.get('adam')); //80
n.delete('adam');
console.log(n.get('adam')); //undefined
複製程式碼

由於一個key只能對應一個vaule,所以對一個key放入value,後面的值會覆蓋前面的值。

Set

set和map類似,也是一組key的集合,但是不儲存value.由於key不能重複,所以,在Set中,沒有重複的值。

要建立一個Set,需要提供一個陣列作為輸入,或者直接建立一個空的Set:

var s1= new Set();
var s2 = new Set([1,3,2]);
console.log(s1) //Set {}
console.log(s2) //Set { 1, 3, 2 }
var s3 = new Set([1,2,3,4,45,6,3,'6']);
console.log(s3); //Set { 1, 2, 3, 4, 45, 6, '6' } 
複製程式碼

重複的元素會被過濾掉

通過add(key)方法可以新增元素到Set中。

s3.add(12);
console.log(s3) //Set { 1, 2, 3, 4, 45, 6, '6', 12 }  
複製程式碼

新增重複的元素不會有效果的

通過delete(key)方法可以刪除元素:

s3.delete(1);
console.log(s3) //Set { 2, 3, 4, 45, 6, '6', 12 }
複製程式碼

##小結

Map和Set是es6標準新增的資料型別,請根據瀏覽器的支援情況和實際情況決定是否要使用。

相關文章