1. 程式人生 > >es6中Map結構相關

es6中Map結構相關

js物件本質上是鍵值對的集合,但是隻能用字串當做鍵

es6提供了map解構,它類似物件,但是鍵各種型別的值都可以
        1.set() 設定map的鍵
        2.get() 獲取map解構中鍵的值
        3.has() 返回一個布林值,判斷該值是否為map結構中的某個鍵
        4.delete() 刪除Map結構中的某個鍵
        5.clear() 清除Map結構所有成員
            var m = new Map()
            m.set('aaa','12')
            console.log
(m.get('aaa')) console.log(m.has('aaa')) m.delete('aaa') console.log(m.has('aaa'))
// 作為建構函式Map結構可以接收一組陣列作為引數,該陣列成員是一個有一個的鍵值對的陣列
    var map = new Map([['a','b'],[1,'c'],['title','terry']])
        console.log(map.size)
        console.log(map.has(1))
        console.log
(map.get(1))
    // map 接受陣列其實是接受一下演算法
        var item = [
            ["e","f"],
            ['c','abc'],
            ['d','efgggd']
        ]
        var map2 = new Map()
        item.forEach((key,value)=>{
            map2.set(key,value)
        })
    // 如果對同一個鍵多次賦值,會發生覆蓋
        var map3 =
new Map() map3.set(1,'abc').set(1,'bcd') console.log(map3.get(1))
    // 如果讀取一個未知的鍵 map結構 返回undefined
    console.log(map3.get('abcd'))
    // 只有對同一個物件的引用map物件才會認為同一個鍵。
        var map4 = new Map()
        map4.set(['a'],'abcdef')
        console.log(map.get(['a']))
    // undefined  set和get 表面上是針對同一個鍵,但實際上這是兩個值,記憶體地址不一樣的  同理 如下

    // 雖然鍵名都一樣但是因為所在的記憶體地址不同 ,是兩個互不干擾的鍵名
        var map5 = new Map()
        var k1 = ['abc']
        var k2 = ['abc']
        map5.set(k1,'abcdef')
        map5.set(k2,'qwert').set('123','love')
        console.log(map5.get(k1))
        console.log(map5.get(k2))
    // Map的操作方法
        // 1 keys() 返回鍵名的遍歷器
        for(var key of map5.keys()){
               console.log(key)
        }
        // 2.values() 返回鍵值的遍歷器
            for(var value of map5.values()){
                console.log(value)
            }
        // 3. entries() 返回所有成員的遍歷器
            for(var[key,value] of map5.entries()){ 
                console.log(key +'----' +value)
            }
            // 等同於  for(var[key,value] of map5)
    // map結構轉為陣列結構
        var map6 = new Map([
               [1,123],[2,234],[3,345]
            ])
        console.log([...map6.keys()])
        console.log([...map6.values()])
        console.log([...map6.entries()])
    // 結合陣列的map方法和 filter() 方法 ,可以實現Map成員的遍歷和過濾
    var map7 =new Map().set(1,'a').set(2,'b').set(3,'c')
        var map8 = new Map(
            [...map7].filter(([k,v])=>{
                return k<3
            })
        )
        console.log(map8)
    // Map的forEach() 方法 也可以實現遍歷,第二引數用於繫結this
            map7.forEach((k,v,m)=>{
                console.log(k+'---'+v+'----')
            })
    //與其他資料結構的相互轉換
        //1 轉陣列 就是通過擴張運算子
      console.log([...map7])
        //2 陣列轉map 將陣列傳入Map結構就ok
    console.log(new Map([['a','aaaaa'],['b','bbbbbbbb']]))
        //3 map轉為物件  ==> 如果所有的鍵都是字串
    function strMaptoObj(strMap){
                let obj = Object.create(null)
                for(var [k,v] of strMap){
                    obj[k] = v
                }
                return obj;
            }
            let mymap = new Map().set('yes',true).set('no',false)
            var json = strMaptoObj(mymap)
            console.log(json)
        //4 物件轉為map
            function objtoMap(obj) {
                let setmap = new Map()
                for (let k of Object.keys(obj)){
                    setmap.set(k,obj[k])
                }
                return setmap
            }
            console.log(objtoMap({yes:true,no:false}))
        // map轉為json  如果鍵名都是字串
    function strMapString(strmap) {
         return JSON.stringify(strMaptoObj(strmap))
    }
   let mymap2 = new Map().set('yes',true).set('no',false)
            console.log(strMapString(mymap2))
        // map鍵名為非字串市 要用擴充套件運算子 轉為陣列json
            function mapToarrayJson(map) {
                return JSON.stringify([...map])
            }
            let myMap3 = new Map().set(true,7)
            console.log(mapToarrayJson(myMap3))
        // jSON 轉為map
            function jsontostrMap(jsonstr) {
                return objtoMap(JSON.parse(jsonstr))
            }
                                   console.log(jsontostrMap('{"yes":true,"no":false}'))
        // 有一種特殊情況,整個json 就是一個數組,且 每個陣列又是一個兩個成員的陣列,這時 她可以一一對應的轉為map結構
    function jsontoMap(jsonstr) {
                return new Map(JSON.parse(jsonstr))
            }
console.log(jsontoMap('[[true,7],[{"foo":3},["abc"]]]'))