数据结构的相互转换

本文介绍 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"]}

本文完!


上一篇
css弹性布局-flex布局 css弹性布局-flex布局
本文介绍CSS3新增的布局方式,flex弹性布局,便于页面布局及项目。 传统的css布局我们知道传统的css定位比较麻烦,比如垂直居中,比较难实现,但是问题比较多,很难实现自适应。 居中 代码: // html代码 <div cla
2018-03-24
下一篇
SASS用法 SASS用法
SASS起源CSS不是一种编程语言,写起来比较麻烦,而且如果要修改整体颜色风格的话,比较费事,需要改很多地方,还要一个一个地找。所以如果将一些公共元素定义为函数中的变量,就可以只修改一处,多处共同更新了。这就是”CSS预处理器”的初步提现。
2017-12-18
目录