Map 是一个带键的数据项的集合,就像一个 Object
一样。 但是它们最大的差别是 Map
允许任何类型的键
它的方法和属性如下:
与对象不同,键不会被转换成字符串。键可以是任何类型。
• new Map() —— 创建 map。
map.set(key, value) —— 根据键存储值。
map.get(key) —— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined。
map.has(key) —— 如果 key 存在则返回 true,否则返回 false。
map.delete(key) —— 删除指定键的值。
map.clear() —— 清空 map。
map.size —— 返回当前元素个数。
虽然 map[key]
也有效,例如我们可以设置 map[key] = 2
,这样会将 map
视为 JavaScript 的 普通对像,因此它暗含了所有相应的限制(没有对象键等)。
每一次 map.set
调用都会返回 map 本身,所以我们可以进行“链式”调用:
map.set('1', 'str1') .set(1, 'num1') .set(true, 'bool1');
Map 迭代
-
map.keys()
—— 遍历并返回所有的键(returns an iterable for keys), -
map.values()
—— 遍历并返回所有的值(returns an iterable for values), -
map.entries()
—— 遍历并返回所有的实体(returns an iterable for entries)[key, value]
,for..of
let recipeMap = new Map([
['cucumber', 500],
['tomatoes', 350],
['onion', 50]
]);
// 遍历所有的键(vegetables)
for (let vegetable of recipeMap.keys()) {
alert(vegetable); // cucumber, tomatoes, onion
}
// 遍历所有的值(amounts)
for (let amount of recipeMap.values()) {
alert(amount); // 500, 350, 50
}
// 遍历所有的实体 [key, value]
for (let entry of recipeMap) { // 与 recipeMap.entries() 相同
alert(entry); // cucumber,500 (and so on)
}
Map
有内置的 forEach
方法,与 Array
类似:
recipeMap.forEach( (value, key, map) => { alert(`${key}: ${value}`); // cucumber: 500 etc });
创建 map对象
1。传入 一个带有键值对的数组
let recipeMap = new Map([
['cucumber', 500],
['tomatoes', 350],
['onion', 50]
]);
2.从一个普通对象创建,可以使用 Object.entrires(obj)
let obj = {
name:"John",
age:30,
address:"河北",
}
let map = new Map(Object.entries(obj));
for(let value of map.values()){
console.log(value);
}
Object.fromEntries:从 Map 创建对象
Object.fromEntries
方法的作用是相反的:给定一个具有 [key, value]
键值对的数组,它会根据给定数组创建一个对象:
let obj = {
name:"John",
age:30,
address:"河北",
}
let map = new Map(Object.entries(obj));
let obj2 = Object.fromEntries(map);
for (let k of obj2.keys()){
console.log(k);
}
Set
Set
是一个特殊的类型集合 —— “值的集合”(没有键),它的每一个值只能出现一次。
-
new Set(iterable)
—— 创建一个set
,如果提供了一个iterable
对象(通常是数组),将会从数组里面复制值到set
中。 -
set.add(value)
—— 添加一个值,返回 set 本身 -
set.delete(value)
—— 删除值,如果value
在这个方法调用的时候存在则返回true
,否则返回false
。 -
set.has(value)
—— 如果value
在 set 中,返回true
,否则返回false
。 -
set.clear()
—— 清空 set。 -
set.size
—— 返回元素个数
let set = new Set();
let john = {name:"John"};
let pete = {name:"pete"};
let mary = {name :"mary"};
set.add(john).add(pete).add(mary);
for ( let k of set ){
console.log(k);
}
Set 迭代(iteration)
我们可以使用 for..of
或 forEach
来遍历 Set:
let set = new Set(["oranges", "apples", "bananas"]);
for (let value of set) alert(value);
// 与 forEach 相同:
set.forEach((value, valueAgain, set) => {
alert(value);});
Map
中用于迭代的方法在 Set
中也同样支持:
-
set.keys()
—— 遍历并返回所有的值(returns an iterable object for values), -
set.values()
—— 与set.keys()
作用相同,这是为了兼容Map
, -
set.entries()
—— 遍历并返回所有的实体(returns an iterable object for entries)[value, value]
,它的存在也是为了兼容Map
。