Map 是 ES6 中新增的一种数据类型,它是一种可以将键值对进行存储的集合,其中键和值都可以是任何类型的数据(包括对象、函数、字符串等等)。 与普通的对象不同的是,Map 会保留键值对添加的顺序,并且通过 Map 提供的一些方法,可以非常方便地进行键值对的添加、删除、遍历等操作。
Map是ES6新增的一种数据类型,它是一种可以存储键值对的集合,其中键和值都可以是任何类型的数据(包括对象和函数),而且可以使用任何类型的值作为键。
在使用Map时,需要使用new关键字来创建一个新的Map对象,如下所示:
const myMap = new Map();
Map对象有一些常用的方法,下面介绍一些常用的方法及其应用。
set(key, value)方法:设置Map对象中键值对的值。
const myMap = new Map();
myMap.set('name', 'John');
myMap.set('age', 30);
get(key)方法:根据键获取Map对象中对应的值。
const myMap = new Map();
myMap.set('name', 'John');
myMap.set('age', 30);
console.log(myMap.get('name')); // 输出 John
console.log(myMap.get('age')); // 输出 30
has(key)方法:判断Map对象中是否存在指定的键。
const myMap = new Map();
myMap.set('name', 'John');
myMap.set('age', 30);
console.log(myMap.has('name')); // 输出 true
console.log(myMap.has('gender')); // 输出 false
size属性:获取Map对象中键值对的个数。
const myMap = new Map();
myMap.set('name', 'John');
myMap.set('age', 30);
console.log(myMap.size); // 输出 2
delete(key)方法:根据键删除Map对象中的键值对。
const myMap = new Map();
myMap.set('name', 'John');
myMap.set('age', 30);
myMap.delete('name');
console.log(myMap); // 输出 Map(1) { "age" => 30 }
clear()方法:清空Map对象中的所有键值对。
const myMap = new Map();
myMap.set('name', 'John');
myMap.set('age', 30);
myMap.clear();
console.log(myMap); // 输出 Map(0) {}
map.keys()方法:返回一个包含Map对象中的所有键的可迭代对象。
let map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');
let keysIterator = map.keys();
for(let key of keysIterator) {
console.log(key); // Output: 'key1', 'key2'
}
map.values()方法:返回一个包含Map对象中的所有值的可迭代对象。
let map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');
let valuesIterator = map.values();
for(let value of valuesIterator) {
console.log(value); // Output: 'value1', 'value2'
}
map.entries()方法:返回一个包含Map对象中的所有键/值对的可迭代对象。
const myMap = new Map();
myMap.set('firstName', 'John');
myMap.set('lastName', 'Doe');
const entries = myMap.entries();
console.log(entries.next().value); // Output: ["firstName", "John"]
console.log(entries.next().value); // Output: ["lastName", "Doe"]
Map是一种非常灵活的数据类型,在实际开发过程中可以非常方便的用来存储和查找数据,特别是在需要存储大量数据或者需要频繁进行搜索的情况下更是如此。
map应用
map------> 数组
//map ----> 对象
let m = new Map();
m.set('name', '李四');
m.set('attr', "打拳");
m.set('age', 20)
let obj = {}
m.forEach((v, k) => {
console.log(k);
obj[k] = v;
})
console.log(obj);
数组------>map
// 对象---->map
let m = new Map()
for (let key in obj) {
m.set(key, obj[key]);
}
console.log(m);
映射转换
ES6 的 Map 可以将一个数组或对象的值映射成一个新值,可以使用 Map.prototype.get() 方法获取一个映射的值,使用 Map.prototype.set() 方法设置一个映射的值,使用 Map.prototype.has() 方法检查映射中是否存在某个键值对,使用 Map.prototype.delete() 方法删除一个键值对。
示例:
const oldArr = [1, 2, 3, 4, 5];
const newArr = oldArr.map(item => item * 2);
console.log(newArr); // [2, 4, 6, 8, 10]
集合去重
ES6 的 Map 还可以用来实现数组的去重,将数组中的值作为键,值可以随便设置,然后使用 Map.prototype.values() 方法获取 Map 中的值并返回一个迭代器对象,用 Array.from() 方法将其转换为一个数组,即可得到去重后的数组。
示例:
const arr = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5];
const set = new Map();
arr.forEach(item => set.set(item, true));
const newArr = Array.from(set.keys());
console.log(newArr); // [1, 2, 3, 4, 5]
对象操作
ES6 的 Map 还可以作为对象的替代品,使用 Map 的好处在于可以使用任何类型的值作为键,而对象只能使用字符串或 Symbol 类型的值作为键。
示例:
const obj = { name: 'Tom', age: 18, gender: 'male' };
const map = new Map(Object.entries(obj));
console.log(map.get('name')); // 'Tom'
console.log(map.get('age')); // 18
console.log(map.get('gender')); // 'male'
回调函数
ES6 的 Map 还可以用来处理回调函数,将回调函数作为参数传入 Map.prototype.forEach() 方法中,在迭代过程中调用回调函数进行处理。
示例:
const map = new Map([
['apple', 2],
['banana', 3],
['pear', 4]
]);
map.forEach((value, key) => {
console.log(`${key} price: ${value} dollars`);
});
// apple price: 2 dollars
// banana price: 3 dollars
// pear price: 4 dollars