新手javascript.info学习笔记——数据类型04(映射和集合)

Map

Map(映射)是一个带键的数据项的集合,就像一个 Object 一样。 但是它们最大的差别是 Map 允许任何类型的key。

它的方法和属性如下:

  • 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 —— 返回当前元素个数。

举个例子:

let map = new Map();

map.set('1', 'str1');   // 字符串键
map.set(1, 'num1');     // 数字键
map.set(true, 'bool1'); // 布尔值键

// 还记得普通的 Object 吗? 它会将键转化为字符串
// Map 则会保留键的类型,所以下面这两个结果不同:
alert( map.get(1)   ); // 'num1'
alert( map.get('1') ); // 'str1'

alert( map.size ); // 3
  • Map 还可以使用object作为key,object则不能(但可以作为value)。
  • 每一次 map.set 调用都会返回 map 本身,所以我们可以进行“链式”调用:
map.set('1', 'str1')
  .set(1, 'num1')
  .set(true, 'bool1');

Map迭代

如果要在 map 里使用循环,可以使用以下三个方法:

  • map.keys() —— 遍历并返回一个包含所有键的可迭代对象,
  • map.values() —— 遍历并返回一个包含所有值的可迭代对象,
  • map.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 类似:

    // 对每个键值对 (key, value) 运行 forEach 函数
    recipeMap.forEach( (value, key, map) => {
      alert(`${key}: ${value}`); // cucumber: 500 etc
    });

    Object.entries:从对象创建 Map

如果我们想从一个已有的普通对象(plain object)来创建一个 Map,那么我们可以使用方法object.entries(obj),该方法返回对象的键/值对数组,该数组格式完全按照 Map 所需的格式。然后使用new map()方法将数组转化成map。

let obj = {
  name: "John",
  age: 30
};

let map = new Map(Object.entries(obj));

alert( map.get('name') ); // John

Object.fromEntries:从 Map 创建对象

Object.fromEntries 方法的作用是相反的:给定一个具有 [key, value] 键值对的数组,它会根据给定数组创建一个对象:

首先调用 map.entries() 将返回一个可迭代的键/值对,这刚好是 Object.fromEntries 所需要的格式。(这一步可以省略,因为Object.fromEntries()方法实际上只需可迭代对象即可)然后用Object.fromEntries()方法获得对象。

Set

Set (集合)是一个特殊的类型集合 —— “值的集合”(没有键),它的每一个值只能出现一次。

在 Map 和 Set 中迭代总是按照值插入的顺序进行的,所以我们不能说这些集合是无序的,但是我们不能对元素进行重新排序,也不能直接按其index(索引)来获取元素。(map可以用key来获取,但这不是index)

它的主要方法如下:

  • new Set(iterable) —— 创建一个 set,如果提供了一个 iterable 对象(通常是数组),将会从数组里面复制值到 set 中。
  • set.add(value) —— 添加一个值,返回 set 本身(如果这个值已经存在则不会发生任何改变,这是set的独特之处
  • set.delete(value) —— 删除值,如果 value 在这个方法调用的时候存在则返回 true ,否则返回 false
  • set.has(value) —— 如果 value 在 set 中,返回 true,否则返回 false
  •  set.clear() —— 清空 set。
  • set.size —— 返回元素个数。

 Set迭代 

Map 中用于迭代的方法在 Set 中也同样支持:

  • set.keys() —— 遍历并返回一个包含所有值的可迭代对象,
  • set.values() —— 与 set.keys() 作用相同,这是为了兼容 Map
  • set.entries() —— 遍历并返回一个包含所有的实体 [value, value] 的可迭代对象,它的存在也是为了兼容 Map
  • 我们可以使用 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);
    });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值