欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6 Map集合

程序员文章站 2023-12-21 23:10:52
...

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串=>值”的对应,Map结构提供了“值=>值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

ES6中的Map 类型是键值对的有序集合,和Object 类型最大的不同点是:Map 集合的键名和对应的值支持所有的数据类型,而Object 类型只能用字符串当作键名。
map里面的参数必须是一个可迭代对象,

//Object 类型

//数值2被自动转为字符串
let obj = {
    2: 2,
    "2": 2
}
console.log(Object.keys(obj).length);
//普通的对象如果属性名一样,会直接覆盖
//输出:1
//Map 类型

let map = new Map([
    [2, 2],
    ["2", 2],
    [{}, {}]
]);
console.log(map.size);
//输出:3

Map的方法

set(key, value)

set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。

let m = new Map();    //set方法添加

//添加一个string类型的键名
m.set("name","张三");  
//添加一个数字类型的键名
m.set(1,2);
//打印结果:Map {"name" => "张三", 1 => 2}

//set方法的使用很简单,只需要给方法传入key和value作为键名和键值即可。
//注意:第三行代码中,我们传入的key是数字1,这就证明了,
//Map结构确实可以存储非字符串类型的键名,当然你还可以设置更多其它类型的键名,

//比如:
m.set([1],2); //数组类型的键名   
m.set({"name":"Zhangsan"},2);    //对象类型的键名
m.set(true,2);   //布尔类型的键名
m.set(Symbol('name'),2);    //Symbol类型的键名 
m.set(null,2);   //null为键名 
m.set(undefined,2);//undefined为键名

get( )方法
get( )方法作用:获取指定键名的键值,返回键值。

let m = new Map([["name","张三"]]);
m.get("name");//张三
m.get("gender");//undefined
//get方法使用也很简单,只需要指定键名即可。
//获取存在对应的键值,如果键值对存在,就会返回键值;
// 否则,返回undefined,这个也很好理解。

delete( )方法
delete( )方法作用:删除指定的键值对,删除成功返回:true,否则返回:false。

let m = new Map();
m.set("name","张三");    //Map {"name" => "张三"}
m.delete("name");//true
m.delete("gender");//false

clear( )方法
跟Set结构一样,Map结构也提供了clear( )方法,让你一次性删除所有键值对。

  let m = new Map();
    m.set("name","张三");
    m.set("gender",1);

    m.clear();
    console.log(m);    //打印结果:Map {}
//使用clear方法后,我们再打印一下变量m,发现什么都没有,一个空的Map结构,说明clear方法起作用了。

has( )方法
has( )方法作用:判断Map实例内是否含有指定的键值对,有就返回:true,否则返回:false。

let m = new Map();
m.set("name","张三");
m.has('name');//结果:true
m.has('age');//结果:false
//Map实例中含有键名:name,就返回了true,键名age不存在,就返回false。

Map遍历方法
Map结构原生提供三个遍历器生成函数和一个遍历方法;
我们可以使用ES6的新特性for…of来遍历它的键名或者键值。
keys():返回键名的遍历器
values():返回键值的遍历器

et m = new Map([
   ["name","张三"],
   ["age",25]
 ]);    //使用keys方法获取键名
for(let key of m.keys()){        
	console.log(key);
}    //name
    // age

 //使用values方法获取键值
for(let value of m.values()){        
   console.log(value);
}   
//张三
//25

entries():返回所有成员的遍历器

let m = new Map([
 ["name","张三"],
 ["age",25]
]);    
for(let [key,value] of m.entries()){ 
   console.log(key+'  '+value);
} 
//name  张三
//age  25


forEach():遍历Map的所有成员

 let m = new Map([
   ["name","张三"],
   ["age",25]
]);
m.forEach(function(value,key){        
	console.log(key+':'+value);
});    
//name:张三
//age:25
//forEach方法接收一个匿名函数,给匿名函数传参value和key,分别是Map实例的键名和键值

Map结构转为数组结构

const map = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

[...map.keys()]
// [1, 2, 3]

[...map.values()]
// ['one', 'two', 'three']

[...map.entries()]
// [[1,'one'], [2, 'two'], [3, 'three']]

[...map]
// [[1,'one'], [2, 'two'], [3, 'three']]

上一篇:

下一篇: