zoukankan      html  css  js  c++  java
  • ES6中的数据结构Map的理解和描述

    1、什么是Map?

    JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。

    Map类型的数据结构,类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象、null、undefined、false、0、空字符串,false等)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

    利用Map构造函数生成一个简单地Map类型对象

    const map = new Map(
       [
         ['name', '李大师'],
         ['title', 'title']
      ]
    )
    
    console.log(map)

    2、Map实例对象的属性和操作方法

    (1)  Map.prototype.size  这个属性返回Map的总得成员数量

    (2)  Map.prototype.set(key, value) , 设置Map的成员,如果没有这个key,则新增,如果已经有这个key,则使用新值覆盖旧值

    const map = new Map()
    
    const obj = { a : 1}
    
    map.set(obj, 2)
    
    map.set(null, 0)
    
    map.set('a' ,1)
    
    map.set(0, false)
    
    map.size   // 4

    (3)Map.prototype.get(key)    get方法读取key对应的键值,如果找不到key,返回undefined

    (4)Map.prototype.has(key)   has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。

    (5)Map.prototype.delete(key)  delete方法删除某个键,删除成功后返回true。如果删除失败,返回false

    (6)Map.prototype.clear()   clear方法清除所有成员,没有返回值。

    const map = new Map()
    
    const obj = { a : 1}
    
    map.set(obj, 2)
    
    map.set(null, 0)
    
    map.set('a' ,1)
    
    map.set(0, false)
    
    map.size   // 4
    
    map.get(obj)  // 2
    
    map.get(null) // 0
    
    map.has(0) // true
    
    map.delete(0) // true
    
    map.clear() 
    
    map.size  // 0

    3、Map数据结构的遍历器方法

    Map.prototype.keys(),  Map.prototype.values(), Map.prototype.entries(), Map.prototype.forEach()

    注意在使用forEach时,和数组以及Set结构中类似,函数参数中的第一个参数是value,第二个是key,使用时要注意这一点

    const map = new Map()
    
    const obj = { a : 1}
    
    map.set(obj, 2)
    
    map.set(null, 0)
    
    map.set('a' ,1)
    
    map.set(0, false)
    
    map.size   // 4
    
    map.get(obj)  // 2
    
    map.get(null) // 0
    
    map.has(0) // true
    
    map.delete(0) // true
    
    const keys = map.keys()
    
    for(let item of keys) {
        console.log(item)
    }
    
    // {a :1 },  null  , a
    
    const values = map.values()
    
    for(let item of values) {
        console.log(item)
    }
    
    //2 ,0 ,1
    
    const en = map.entries()
    
    for(let item of en) {
        console.log(item)
    }
    
    // [ {a: 1}, 2]  [null, 0] , ['a', 1]
    
    map.forEach((value, key)=>{
        console.log(value, key)
    })
    
    // 2 {a: 1}  0 null   1 'a'

    4、Map与数组Array之间的转换

    可以使用扩展运算符..., 也可使用Array.prototype.form()方法

    const map = new Map()
    
    map.set(0, 0)
    
    map.set(1, 1)
    
    map.set(2, 2)
    
    map.set(null, null)
    
    const array = Array.from(map)
    
    const arr2 = [...map]
    
    console.log(array)
    
    // 输出 [[0,0], [1,1], [2, 2], [null, null]]
    
    console.log(arr2)
    
    // 输出 [[0,0], [1,1], [2, 2], [null, null]]

    将数组结构的数组转为map, 注意由于Map是键值对类型的结构,那么必须是二维数组的形式

    const arr1 = [ [ 1, 2 ], [3, 4], [5,6]]
    
    const map1 = new Map(arr1)
    
    const en1 = map1.entries()
    
    for(let item of en1) {
        console.log(item)
    }
    
    // [1, 2], [3, 4], [5,6]
    
    const arr2 = [[1, 2, 3], [ 4,5,6,7], [8,9,10]]
    
    const map2 = new Map(arr2)
    
    const en2 = map2.entries()
    
    for(let item of en2) {
        console.log(item)
    }
    
    // [1, 2], [4, 5] , [8 ,9]
    
    const arr3 = [[ 1, [2, 3]], [4, [5, 6, 7]], [8, [9, [10,11]]] ]
    
    const map3 = new Map(arr3)
    
    const en3 = map3.entries()
    
    for(let item of en3) {
        console.log(item)
    }
    
    // [1, [2, 3]],  [4, [5,6,7]], [8, [9, [10, 11]]]

    将JSON或者对象转为Map

    JSON对象或者合法的Object对象的key都是字符串,那么转为Map非常容易

    function objectTomap(obj) {
       const map = new Map();
       for (let k of Object.keys(obj)) {
          map.set(k, obj[k]);
       }
       return map
    }
    
    
    const obj = {
      a : 1 ,
      b: 2,
      c: 3
    }
    
    const map = objectTomap(obj)
    
    const en  = map.entries()
    
    for(let item of en) {
       console.log(item)
    }
    
    // ['a', 1],  ['b', 2], ['c', 3]

    5、注意事项

    在map中,同一个变量在key中是不允许重复的,但是同一个引用类型的对象却是可以的

    const map = new Map()
    
    const arr = [1]
    map.set(arr, 1)
    
    map.set([1], 1)
    
    map.set([1], 2)
    
    map.get(arr)  // 1
    
    map.get([1])  // undefined
    
    // 这是因为[1] != [1] ,数组和对象都指向 不同的引用的地址,那么即使
    
    map.set([1], 1)
    
    map.get([1])  // undefined, 因为这里的[1]已经是一个新的数组,而不是上面那个set操作里的那个[1], 如果想这么设置就需要定义一个变量
    
    const arr2 = [1]
    
    map.set(arr2, 1)
    
    map.get(arr2) // 1, 因为这里的arr2是一个独一无二的引用
    
    const arr3 = arr2 
    
    map.set(arr3, 2)
    
    map.get(arr2) //  2
    
    map.get(arr3) // 2
    
    // 同一个引用下指向的地址相同
  • 相关阅读:
    【机器学习】浅谈协方差
    python {}.format
    【机器学习】准确率、精确率、召回率
    【声纹识别】 EER
    【机器学习】 最形象的入门
    逻辑卷-LVM
    RAID及软RAID的实现
    输入数字or 字符串,统计重复次数---字典统计练习
    Python-数据结构之dict(字典*****)
    POJ 3204 网络流的必须边
  • 原文地址:https://www.cnblogs.com/liquanjiang/p/11438709.html
Copyright © 2011-2022 走看看