softnshare / es6

ECMAScript 6入門讀書會
https://goo.gl/lcTUad
57 stars 14 forks source link

Create chapter-13 #10

Closed dorismi closed 8 years ago

dorismi commented 8 years ago

ES6 讀書會

Set 和 Map 數據結構

Doris


導讀內容


Set


Set 程式範例

//構造函數
var s = new Set([1,2,3,4,4,5,"5",NaN,NaN,0,-0]);
[...s]; //[1,2,3,4,5,"5",NaN,0,-0] 將重複值剔除

//類似 Array 的物件
function divs () {
  return [...document.querySelectorAll('div')];
}

var set = new Set(divs());
set.size;

Set 實做的屬性與方法


Set 實做的屬性與方法程式範例

//add(value) 因為回傳 Set 結構本身,可用 Cascading
var s = new Set();
s.add('a')
 .add('b')
 .add('c');

//delete(value)
s.delete('b');

//has(value)
s.has('a');

//clear()
s.clear();

Set 結構轉為 Array

var array2 = Array.from(new Set([1,1,2,2,3]));
[...array2]

Set 的遍歴操作


keys(),values(),entries()


程式範例

let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
  console.log(item);
}
for (let item of set.values()) {
  console.log(item);
}
for (let item of set.entries()) {
  console.log(item);
}
for (let item of set) {
  console.log(item);
}

forEach()

let set = new Set([1, 2, 3]);
set.forEach((v, k) => console.log(v * 2));

遍歷的應用


程式範例 - 擴展運算符(...)

let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));

let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0));

程式範例 - 遍歷操作中,同步改變 Set 結構

// 映射新的 Set 再賦值給原本的 Set
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));

// Array.from()
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2));

Map


Map 程式範例

//Array 中有兩個鍵值對的 Array
var map = new Map([['name', 'Jhon'], ['title', 'test']]);
console.log(map); //Map {"name" => "Jhon", "title" => "test"}

//對同一物件的引用
var map1 = new Map();
var obj = ['a'];
map1.set(obj, 555);
map1.get(obj);

Map 實做的屬性與方法


Map 實做的屬性與方法程式範例

let m = new Map();
m.set("edition", 6)        // 鍵是字符串
m.set(262, "standard")     // 鍵是數值
m.set(undefined, "nah")    // 鍵是undefined

var hello = function() {console.log("hello");}
m.set(hello, "Hello ES6!") // 鍵是函數

m.size // 4
m.get(hello); // Hello ES6!
m.has(262); // true
m.has(123); // false
m.delete(262); // true
m.clear();

Map 的遍歴操作


entries()

let map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}

// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value);
}

// 等同于使用map.entries()
for (let [key, value] of map) {
  console.log(key, value);
}

forEach

let map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);

map.forEach(function(value, key, map){
  console.log("Key: %s, Value: %s", key, value);
});

//可以接受第二個參數,用來綁定 this
var map2 = new Map().set(1, 'a').set(2, 'b').set(3, 'c');
var reporter = {
    report: function(x, y){
        return x + y;
    }
}
map2.forEach(function(v, k){
    console.log(this.report(1, 2)); //this 指向 reporter
}, reporter);

與其他資料結構的互相轉換


Map 與 Array


Map 轉為 Array

let map = new Map([
  [1, 'a'],
  [2, 'b'],
  [3, 'c'],
]);

// 產生 Map 結構 {1 => 'a', 2 => 'b'}
let map1 = new Map(
  [...map].filter(([k, v]) => k < 3)
);

// 產生 Map 結構 {2 => '_a', 4 => '_b', 6 => '_c'}
let map2 = new Map(
  [...map].map(([k, v]) => [k * 2, '_' + v])
    );

Array 轉為 Map

var map3 = new Map([[true, 7], [{foo: 3}, ['abc']]]);

Map 與 Object

function strMapToObj(strMap) {
  let obj = Object.create(null);
  for (let [k,v] of strMap) {
    obj[k] = v;
  }
  return obj;
}

let myMap = new Map().set('yes', true).set('no', false);
strMapToObj(myMap)

Map 與 JSON

//key 都是字串
function strMapToJson(strMap) {
  return JSON.stringify(strMapToObj(strMap));
}

let myMap = new Map().set('yes', true).set('no', false);
strMapToJson(myMap)

//key 有非字串符
function mapToArrayJson(map) {
  return JSON.stringify([...map]);
}

let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);
mapToArrayJson(myMap)

WeakSet

var ws = new WeakSet();
ws.add(1) // TypeError: Invalid value used in weak set

//以下範例,a 是陣列,有兩個成員,都是陣列
//a 的成員會成為 WeakSet 的成員,不是 a 陣列本身
//這意味陣列的成員只能是物件類型
var a = [[1,2],[3,4]];
ws.add(a);

WeakSet 方法


WeakMap


WeakMap 與 Map 在 API 上的區別