Map and Set(映射和集合)

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

 

posted @ 2021-03-05 16:39  大叔学编程  阅读(41)  评论(0)    收藏  举报