JS Map Set and iterable
阿新 • • 發佈:2018-12-24
JS Map Set and iterable
Map
- js預設的物件表示方式{}可以看作其它語言中的Map和Dictionary的資料結構,一組鍵值對
- js物件的鍵必須是字串,實際上Number和其它資料型別也是非常合理的
- es6規範引入了新資料型別Map
- 定義
var m = new Map(['Michael', 95], ['Bob', 75], ['Tracy', 85]);
m.get('Michael'); // 95
- Map需要一個名字成績對照表,根據名字查成績,無論表多大,查詢速度都是非常快的
- 初始化需要一個二位陣列或者空Map
var m = new Map()
m.set('Adam', 67); //add a new key-value
m.has('Adma'); // has or has not a key
m.delete('Adam'); // delete the key
m.get('Adam'); // get the value
- 一個鍵只對應一個值,所以後邊的值會把前面的值沖掉
Set
- 與Map類似,是一組key的集合,但不儲存value,沒有重複的元素
- 建立Set,需要提供一個Array,或者一個空Set
var s1 = new Set(); // empty Set
var s2 = new Set([1, 2, 3]); // 包含1 2 3
- Set應用場景
- 丟棄重複註冊的監聽器: Set資料唯一
- 監聽器按順序呼叫: Set按插入順序遍歷
- 呼叫所有監聽器: Set遍歷跟陣列差不多快
- 經常新增/刪除: Set新增/刪除都很快
- 所以Set對應的是陣列,而不是物件。
iterable
- Map 和 Set無法使用下表迴圈,為了統一集合型別,es6引入了新的iterable型別,Array、Map、和Set都屬於iterable型別,可以用for…of來遍歷
- for…in遍歷的實際上是物件的屬性名稱,陣列實際上也是一個物件,它每個元素的索引都被視為一個屬性,for…of只迴圈集合本身型別的元素
- 更好的方法是使用iterable內建的forEach方法,接受一個函式,每次迭代自動回撥該函式
var a = ['a', 'b', 'c'];
a.forEach(function(element, index, array) {
console.log(element + ', index = ' + index);
});
- Set於Array類似,但是Set沒有索引,因此回撥函式前兩個引數都是鍵本身。
- Map的回撥函式依次為value key map
var m = new Map([1, 'x'], [2, 'y'], [3, 'z']);
m.forEach(function(value, key, map) {
console.log(value);
}); // 輸出 x y z;