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));