js中 Map对象
Map对象
Map对象用于保存键值对。且能记住键的原始插入顺序(set()方法首次插入到集合中的顺序)。任何值(对象或基本类型)都可以作为一个键或一个值。 Map中的每个键都是独一无二的(只能出现一次)。 Map对象在循环迭代时,会按插入顺序进行(set的顺序)
const map1 = new Map();
map1.set('a', 1);
map1.set('b', 2);
map1.set('c', 3);
console.log(map1.get('a'));
// expected output: 1
map1.set('a', 97);
console.log(map1.get('a'));
// expected output: 97
console.log(map1.size);
// expected output: 3
map1.delete('b');
console.log(map1.size);
// expected output: 2
与Object相比,Map有一些区别
- Map默认情况不包含任何键。只包含显示插入的键(set())
- Map的键可以是任意值(包括函数、对象或任意基本类型)
- Map的键是有序的
- 频繁增删键值对的场景使用Map更好
- Map的键值对个数可以通过size获得 构造函数 Map() 创建 Map 对象。
方法
map.size // 属性返回 Map 结构的成员总数。
Map.prototype.set(key, value) // 方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
// set方法返回的是当前的Map对象,因此可以采用链式写法。
Map.prototype.get(key) // 读取key对应的键值,如果找不到key,返回undefined。
Map.prototype.has(key) // 返回一个布尔值,表示某个键是否在当前 Map 对象之中
Map.prototype.delete(key) // 删除某个键,返回true。如果删除失败,返回false。
Map.prototype.clear() // 清除所有成员,没有返回值
遍历
Map.prototype.keys():// 返回键名的遍历器。
Map.prototype.values():// 返回键值的遍历器。
Map.prototype.entries():// 返回所有成员的遍历器。
Map.prototype.forEach():// 遍历 Map 的所有成员
forEach // 可以接受第二个参数,用来绑定this。
与其他类型的转换
- Map转为数组 (扩展运算符)
const page_info = new Map();
page_info.set("title", "javascript es6的map映射");
page_info.set("author", "infoq");
console.log([...page_info]); // [ [ 'title', 'javascript es6的map映射' ], [ 'author', 'infoq' ] ]
- Map转为Object
function mapToObj(map) {
const obj = Object.create(null);
map.forEach((v,k)=>{
obj[k] = v;
});
return obj;
}
const page_info = new Map();
page_info.set("title", "javascript es6的map映射");
page_info.set("author", "infoq");
console.log( mapToObj(page_info));
// [Object: null prototype] {
// title: 'javascript es6的map映射',
// author: 'infoq'
}
- Map转为JSON (先转为对象,再使用JSON.stringfy)
function mapToObj(map) {
const obj = Object.create(null);
map.forEach((v,k)=>{
obj[k] = v;
});
return obj;
}
function mapToJson(map){
return JSON.stringify(mapToObj(map));
}
const page_info = new Map();
page_info.set("title", "javascript es6的map映射");
page_info.set("author", "infoq");
console.log( mapToJson(page_info)); // {"title":"javascript es6的map映射","author":"infoq"}
- 对象转为Map (可以通过Object) (通过 Object.entries())
const page_info = {
title:"javascript es6的map映射",
author:"infoq"
};
console.log(new Map(Object.entries(page_info))); // Map { 'title' => 'javascript es6的map映射', 'author' => 'infoq' }
- 数组转为Map
const page_info = [
["title","javascript es6的map映射"],
["author","infoq"]
];
console.log(new Map(page_info)); // Map { 'title' => 'javascript es6的map映射', 'author' => 'infoq' }