您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

11.4、有关Map的遍历应用


        /*
            结合数组的 map 方法、filter方法,可以实现 Map 的遍历和过滤 (Map 本身没有 map 和 filter 方法)
        */

        const m1 = new Map().set(1, 'a').set(2, 'b').set(3, 'c')

        console.log(m1)  // Map(3) {1 => "a", 2 => "b", 3 => "c"}

        const m2 = new Map(
            [...m1].filter(([k, v]) => k < 3)
        )

        console.log(m2)  // Map(2) {1 => "a", 2 => "b"}

        const m3 = new Map(
            [...m1].map(([k, v]) => [k * 2, '_' + v])
        )

        console.log(m3)  // Map(3) {2 => "_a", 4 => "_b", 6 => "_c"}




        // 此外,Map 还有一个 forEach 方法,与数组的 forEach 方法类似,也可以实现遍历   ---> 难理解 p222








        /*
            11.3.4 与其他数据结构的互相转换

                + Map 转为数组
                + 数组转为 Map
                + Map 转为对象
                + 对象转为 Map
                + Map 转为 JSON
                + JSON 转为 Map
        */

        // Map 转为数组

        // 前面已提过,Map 转为数组最简便的方法就是使用扩展运算符(...)

        const myMap1 = new Map()
        .set(true, 7)
        .set({foo: 3}, ['abc'])

        console.log(myMap1)
        console.log(...myMap1)
        console.log([...myMap1])        // (2) [Array(2), Array(2)]  // [ [true, 7], [ { foo: 3 },  [ "abc" ] ] ] 




        // 数组转为 Map 

        // 将数组传入 Map 构造函数就可以转为 Map

        const m4 = new Map([
            [true, 7],
            [{foo: 3}, ['abc']]
        ])
        console.log(m4)                // Map(2) {true => 7, {…} => Array(1)}




        // Map 转为对象

        // 如果 Map 的所有键都是字符串,则可以转为对象

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

        const myMap2 = new Map()
        .set('yes', true)
        .set('no', false)
        strMapToObj (myMap2)




        // 对象转为 Map 

        function 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})




        // Map 转为 JSON

        // Map 转为 JSON 要区分两种情况.一种情况是,Map 的键名都是字符串,这时可以选择转为对象 JSON

        function strMapToJson(strMap) {
            return JSON.stringify(strMapToObj(strMap))
        }

        let myMap3 = new Map().set('yes', true).set('no', false)

        strMapToJson(myMap3)


        // 另一种情况是,Map 的键名有非字符串,这时可以选择转为数组 JSON

        function mapToArrayJson(map) {
            return JSON.stringify([...map])
        }

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

        mapToArrayJson(myMap4)




        // JSON 转为 Map

        // JSON 转为 Map,正常情况下所有键名都是字符串

        function jsonToStrMap(jsonStr) {
            return objToStrMap(JSON.parse(jsonStr))
        }

        jsonToStrMap('{"yes": true, "no": false}')




        // 但是有一种特殊情况:整个 JSON 就是一个数组,且每个数组成员本身又是一个具有两个成员的数组.这时,它可以一一对应地转化为 Map ,这往往是数组转为 JSON 的逆操作.

        function jsonToMap(jsonStr) {
            return new Map(JSON.parse(jsonStr))
        }

        jsonToMap('[[true, 7], [{"foo": 3}, ["abc"]]]')

        


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进