1.什么是map
它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
声明语法1: 使用构造函数来声明Map类型
const map = new Map();
声明语法2: 在声明map数据类型的同时,定义数值
在()中以 二维数组的形式,定义存储的数据
每一个二维数值的单元,就是Map类型存储的一个单元
二维数组的第一个单元是Map单元的键名,二维数组的第二个单元是Map单元的键值
const map = new Map([ [ '键名' , '键值' ] , ['键名' , '键值'] , ['键名' , '键值'] , ['键名' , '键值'].... ] );
新增单元
map类型.set(参数1,参数2)
参数1:新增单元的键名
参数2:新增单元的键值
调用使用
map类型.get(键名)
通过键名来调用键值
不用管 0,1,2...的索引,直接拿键名调用数据
删除: 删除一个
map类型.delete('键名')
通过键名来删除单元
清除: 删除所有
map类型.clear()
循环: 与普通的forEach() 循环 完全一样
map类型.forEach((键值,键名=>{})
判断: map中是键名
map类型.has('键名') 结果是布尔类型
size属性返回 Map 结构的成员总数
map.size
// 声明的同时,来定义数据
const map = new Map([ ['name','张三'] , ['age',18] , ['sex','男'] , ['arr' , [1,2,3,4,5]] , ['obj' , {phone:123,addr:'北京'}] ]);
// 新增单元
map.set('fun' , ()=>{console.log(123)});
// 调用 不用管 0,1,2...的索引,直接拿键名调用数据
console.log( map.get('name') ); //张三
console.log( map.get('obj') ); //{phone:123,addr:'北京'}
console.log( map.get('obj').addr ); //北京
// 删除单元
map.delete('name');
// 循环遍历 与 普通的forEach 完全相同
map.forEach( (v,k)=>{
console.log(v,k); //v键值 k键名
})
// 判断是否是map中的成员
console.log( map.has('age') ); //ture
// 清除所有单元
map.clear();
map.size // 0
注意
如果对同一个键多次赋值,后面的值将覆盖前面的值
const map = new Map();
map.set(1, 'aaa').set(1, 'bbb');
map.get(1) // "bbb"
如果读取一个未知的键,则返回undefined
new Map().get('asfddfsasadf') // undefined
只有对同一个对象的引用,Map 结构才将其视为同一个键。这一点要非常小心。
const map = new Map();
map.set(['a'], 555);
map.get(['a']) // undefined
同理,同样的值的两个实例,在 Map 结构中被视为两个键。
const map = new Map();
const k1 = ['a'];
const k2 = ['a'];
map.set(k1, 111).set(k2, 222);
map.get(k1) // 111
keys(): 返回键名的遍历器。
values(): 返回键值的遍历器。
entries(): 返回所有成员的遍历器。
forEach(): 遍历 Map 的所有成员。
map的循环遍历
let map = new Map([
['F', 'no'],
['T', 'yes'],
]);
for (let key of map.keys()) {
console.log(key); // "F" // "T"
}
for (let value of map.values()) {
console.log(value); // "no" // "yes"
}
for (let item of map.entries()) {
console.log(item[0], item[1]); // "F" "no" // "T" "yes"
}
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value); // "F" "no" // "T" "yes"
}
// 等同于使用 map.entries()
for (let [key, value] of map) {
console.log(key, value); // "F" "no" // "T" "yes"
}
Map 结构转为数组结构, 比较快速的方法是结合使用扩展运算符(...)。
let map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
console.log([...map.keys()])
// [1, 2, 3]
console.log([...map.values()])
// ['one', 'two', 'three']
console.log([...map.entries()])
// [[1,'one'], [2, 'two'], [3, 'three']]
console.log([...map])
// [[1,'one'], [2, 'two'], [3, 'three']]
如果所有 Map 的键都是字符串, 它可以转为对象
function strMapToObj(strMap) {
let obj = Object.create(null);
for (let [k, v] of strMap) {
obj[k] = v;
}
return obj;
}
let myMap = new Map().set('yes', true).set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }
Map 转为 JSON 要区分两种情况。 一种情况是, Map 的键名都是字符串, 这时可以选择转为对象 JSON。
function strMapToJson(strMap) {
return JSON.stringify(strMapToObj(strMap));
}
let myMap = new Map().set('yes', true).set('no', false);
strMapToJson(myMap)
// '{"yes":true,"no":false}'
另一种情况是, Map 的键名有非字符串, 这时可以选择转为数组 JSON。
function mapToArrayJson(map) {
return JSON.stringify([...map]);
}
let myMap = new Map().set(true, 7).set({
foo: 3
}, ['abc']);
mapToArrayJson(myMap)
// '[[true,7],[{"foo":3},["abc"]]]'
Comments | NOTHING