本文介绍 Map与Array,Object,JSON之间的相互转换
Map转为Array
Map转为Array,直接使用es6引入的扩展运算符(…)。
let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);
console.log(myMap); // Map {true => 7, Object {foo: 3} => ['abc']}
console.log([...myMap]); // [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]
Array转为Map
将Array转入Map构造函数,就可以转为Map。
let myMap = new Map([[true, 7], [{foo: 3}, ['abc']]])
console.log(myMap); // Map {true => 7, Object {foo: 3} => ['abc']}
Map转为Object
如果所有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);
console.log(myMap); // Map {"yes" => true, "no" => false}
let obj = strMapToObj(myMap);
console.log(obj); // Object {yes: true, no: false}
Object转为Map
function objToStrMap(obj) {
let strMap = new Map();
for (let k of Object.keys(obj)) {
strMap.set(k, obj[k]);
}
return strMap;
}
let obj = {yes: true, no: false};
console.log(obj); // Object {yes: true, no: false}
let myMap = objToStrMap(obj);
console.log(myMap); // Map {"yes" => true, "no" => false}
Map转为JSON
Map转为JSON要区分两种情况。一种情况是,Map的键名都是字符串,这时可以选择转为对象JSON.
另一种情况是,Map的键名有非字符串,这时可以选择转为数组JSON。
Map转为对象JSON
function strMapToJson(strMap) {
let obj = Object.create(null);
for (let [k,v] of strMap) {
obj[k] = v;
}
return JSON.stringify(obj);
}
let myMap = new Map().set('yes', true).set('no', false);
console.log(myMap); // Map {"yes" => true, "no" => false}
let objJson = strMapToJson(myMap);
console.log(objJson); // {"yes":true,"no":false}
Map转为数组JSON
function mapToArrayJson(map) {
return JSON.stringify([...map]);
}
let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);
console.log(myMap); // Map {true => 7, Object {foo: 3} => ["abc"]}
let arrJson = mapToArrayJson(myMap);
console.log(arrJson); // [[true,7],[{"foo":3},["abc"]]]
JSON转为Map
JSON转为Map,正常情况下,所有键名都是字符串。
但是,有一种特殊情况,整个JSON就是一个数组,且每个数组成员本身,又是一个有两个成员的数组。这时,它可以一一对应地转为Map。这往往是数组转为JSON的逆操作。
JSON键名是字符串
function jsonToStrMap(jsonStr) {
let obj = JSON.parse(jsonStr);
let strMap = new Map();
for (let k of Object.keys(obj)) {
strMap.set(k, obj[k]);
}
return strMap;
}
let strJson = '{"yes":true,"no":false}';
console.log(strJson); // {"yes":true,"no":false}
let myMap = jsonToStrMap(strJson);
console.log(myMap); // Map {"yes" => true, "no" => false}
JSON数组
function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
let arrJson = '[[true,7],[{"foo":3},["abc"]]]';
console.log(arrJson); // [[true,7],[{"foo":3},["abc"]]]
let myMap = jsonToMap(arrJson);
console.log(myMap); // Map {true => 7, Object {foo: 3} => ["abc"]}
本文完!