js中的Map结构及数据类型转换

163 阅读2分钟

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。

与其他类型的转换

  1. 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' ] ]
  1. 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'
}
  1. 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"}
  1. 对象转为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' }
  1. 数组转为Map
const page_info = [
    ["title","javascript es6的map映射"],
    ["author","infoq"]
];
console.log(new Map(page_info)); // Map { 'title' => 'javascript es6的map映射', 'author' => 'infoq' }