es6 javascript的map資料型別轉換
阿新 • • 發佈:2019-01-09
(1) Map 轉為陣列
前面已經提過, Map 轉為陣列最方便的方法, 就是使用擴充套件運算子(...)。
let myMap = new Map().set(true, 7).set({
foo: 3
}, ['abc']);
[...myMap]
// [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]
(2) 陣列轉為 Map
將陣列轉入 Map 建構函式, 就可以轉為 Map。
(3) Map 轉為物件new Map([ [true, 7], [{ foo: 3 }, ['abc'] ] ]) // Map {true => 7, Object {foo: 3} => ['abc']}
如果所有 Map 的鍵都是字串, 它可以轉為物件。
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)
// { yes: true, no: false }
(4) 物件轉為 Map
(5) Map 轉為 JSONfunction objToStrMap(obj) { let strMap = new Map(); for (let k of Object.keys(obj)) { strMap.set(k, obj[k]); } return strMap; } objToStrMap({ yes: true, no: false }) // [ [ 'yes', true ], [ 'no', false ] ]
Map 轉為 JSON 要區分兩種情況。 一種情況是, Map 的鍵名都是字串, 這時可以選擇轉為物件 JSON。
function strMapToJson(strMap) {
return JSON.stringify(strMapToObj(strMap));
}
let myMap = new Map().set('yes', true).set('no', false);
strMapToJson(myMap)
// '{"yes":true,"no":false}'
另一種情況是, Map 的鍵名有非字串, 這時可以選擇轉為陣列 JSON。
(6) JSON 轉為 Mapfunction mapToArrayJson(map) { return JSON.stringify([...map]); } let myMap = new Map().set(true, 7).set({ foo: 3 }, ['abc']); mapToArrayJson(myMap) // '[[true,7],[{"foo":3},["abc"]]]'
JSON 轉為 Map, 正常情況下, 所有鍵名都是字串。
function jsonToStrMap(jsonStr) {
return objToStrMap(JSON.parse(jsonStr));
}
jsonToStrMap('{"yes":true,"no":false}')
// Map {'yes' => true, 'no' => false}
但是, 有一種特殊情況, 整個 JSON 就是一個數組, 且每個陣列成員本身, 又是一個有兩個成員的陣列。 這時, 它可以一一對應地轉為 Map。 這往往是陣列轉為 JSON 的逆操作。
function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
jsonToMap('[[true,7],[{"foo":3},["abc"]]]')
// Map {true => 7, Object {foo: 3} => ['abc']}