La aplicación básica y la realización de escritura a mano de Map.

Primero, el uso básico de Map

1. Uso básico

    // Map 是一个构造函数
    let map = new Map();
    // k,v 可以是任意数据类型

    // 设置
    map.set(1,'a')
    map.set(1,'b') // 相同key覆盖,去重
    map.set({ name:'ls' },'12')
    console.log(map); // { 1 => 'b', {...} => '12' }

    // 获取
    map.get(1); // b
    // 判断
    map.has(1); //true
    // 删除
    map.delete(1);

    // 遍历
    for(let entries of map){ //entries是[k,v]的数组
       console.log(entries); //[1, 'b']  [{...}, '12']
    }

2. En el desarrollo real, las nuevas estructuras de datos, como Map, solo existen en js, lo que no favorece la transmisión, por lo que debemos transformarlas nosotros mismos.

   Conversión mutua entre Map, Set, Array y Object en js:
    (1) Object.entries obtiene el par clave-valor del objeto
    (2) Object.FromEntries convierte la lista de pares clave-valor en un objeto
    (3) Object. Las entradas y Object .fromEntries son reversibles.

    // 1. Object转Map
          let obj = {foo:'hello',bar:100};
          let map = newap(Object.entries(obj));
          console.log(map) 

    // 2. Map转Object
          let map = new Map([['foo','hello'],['bar',100]]);
          let obj = Object.fromEntries(map);
          console.log(obj);

    // 3. Object转Array
          let obj = {'foo':'hello','bar':100};
          let arr = Object.entries(obj);
          console.log(arr);

    // 4. Array转成Object
          let arr = [['foo','hello'],['bar',100]];
          let obj = Object.fromEntries(arr);
          console.log(obj);

    // 5. Array转Set
          let arr = [['foo','hello'],['bar',100]];
          let set = new Set(arr);
          console.log(set)

 3. Comparación de mapas

      Comparación funcional: Map tiene más métodos, deduplicación y tipos de datos de referencia clave que Object

      Comparación de rendimiento:

      La búsqueda de matriz es rápida, la adición y eliminación de listas vinculadas es rápida, y Map combina las ventajas de matriz + lista vinculada para lograr una adición, eliminación, modificación y consulta de alto rendimiento (matriz externa, dentro está la lista vinculada)

2. Mapa escrito a mano

   let count = 8;
   // 8个元素的数组,以byte最小单位
   function MyMap(){
      //构造器
      this.initStore();
   }
   MyMap.prototype.initStore = function(){
       this.store = new Array(count); //八个房间
       // 初始化链表头
       for(let i = 0; i < this.store.length; i++){
          this.store[i] = {
            next: null
          }
       }
   }
   
   // 取到位置
   MyMap.prototype.hash = function(k){
      return k % count;
   }

   // set方法
   MyMap.prototype.set = function(k,v){
      // 通过key 计算余数8,取得房间号
      let roomIndex = this.hash(k);
      // 取出链表头
      let queue = this.store[roomIndex];

      // 找元素
      while(queue.next){
        // 不断向下找
        if(queue.next.key === k){
            // 覆盖
           return queue.next.value = v;
        } else {
            // 下一个
            queue = queue.next;
        }
      }

      // 第一次执行到这里,就是第一个数据 k:1
      // 第二次以后执行到这里,就是末尾的一个
      queue.next = {
         next:null,
         key:k,
         value:v
      }
   }

  // get方法
  MyMap.prototype.get = function(k){
      let roomIndex = this.hash(k);
      let queue = this.store[roomIndex];
      // 跳过链表头
      queue = queue.next;

      // 查找当前看是不是
      while(queue){
        if(queue.key === k){
            return queue.value;
        } else {
            // 指针下移
            queue = queue.next;
        }
      }
      
      return undefined;
  }

 // has方法
 MyMap.prototype.has = function(k){
      return this.get(k) !== undefined;
 }


 let m = new MyMap()
   m.set(1,'a')
   m.set(2,'b')
   m.set(3,'c')
   m.set(4,'d')
   m.set(5,'e')
   m.set(6,'f')
   m.set(7,'g')

 console.log(m);
 console.log(m.get(1),m.set(9,'h'),m.has(3));
  

Supongo que te gusta

Origin blog.csdn.net/m0_65835778/article/details/131474916
Recomendado
Clasificación