1. 程式人生 > >JS Map Set and iterable

JS Map Set and iterable

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;