ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map(六)

简介: ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map(六)

13.5 Promise 读取多个文件

不基于Promise实现:

// 导入文件模块
const fs = require('fs')
// 读取三个文件,将文件的内容按读取的顺序进行拼接输出
fs.readFile('./00-文本文件.txt', (err, data1) => {
  fs.readFile('./00-文本文件.txt', (err, data2) => {
    fs.readFile('./00-文本文件.txt', (err, data3) => {
      console.log(data1+'\n'+data2+'\n'+data3)
    })
  })
})

基于Promise实现

// 基于Promise实现
const p1 = new Promise((resolve, reject) => {
  // 读取第一个文件
  fs.readFile('./00-文本文件.txt', (err, data) => {
    // 调用成功函数,将读取到的数据传递给成功的回调函数
    resolve(data)
  })
})
// 执行回调函数
p1.then(value => {
  // 读取第二个文件,返回一个Promise对象,对象的结果为之前的数据加上新读取到的文件数据
  return new Promise((resolve, reject) => {
    fs.readFile('./00-文本文件.txt', (err, data) => {
      resolve(value + '\n' + data)
    })
  })
}).then(value => {
  // 读取第三个文件,返回一个Promise对象,对象的结果为之前的数据加上新读取到的文件数据
  return new Promise((resolve, reject) => {
    fs.readFile('./00-文本文件.txt', (err, data) => {
      resolve(value + '\n' + data)
    })
  })
}).then(value => {
  // 对读取到的数据进行输出
  console.log(value)
})

13.6 catch() 方法

catch() 方法可以用于捕获失败的Promise,并对其进行处理。

可以前面的then()不指定失败的回调函数,失败的回调函数在catch中指定,当前面有失败的Promise就会被catch捕获。

// 导入文件模块
const fs = require('fs')
// 基于Promise实现
const p1 = new Promise((resolve, reject) => {
  // 读取第一个文件
  fs.readFile('./00-文本文件.txt', (err, data) => {
    // 调用成功函数,将读取到的数据传递给成功的回调函数
    resolve(data)
  })
})
// 执行回调函数
p1.then(value => {
  // 读取第二个文件,返回一个Promise对象,对象的结果为之前的数据加上新读取到的文件数据
  return new Promise((resolve, reject) => {
    fs.readFile('./00-文本文件.txtxxxxxxxxxxxxxxxx', (err, data) => {
      if (err) reject(err)
      resolve(value + '\n' + data)
    })
  })
}).then(value => {
  // 读取第三个文件,返回一个Promise对象,对象的结果为之前的数据加上新读取到的文件数据
  return new Promise((resolve, reject) => {
    fs.readFile('./00-文本文件.txt', (err, data) => {
      resolve(value + '\n' + data)
    })
  })
}).then(value => {
  // 对读取到的数据进行输出
  console.log(value)
}).catch(reason => {
  console.log(reason)
})

catch()对错误信息进行捕获

14. 集合 – Set

ES6 提供了新的数据结构 Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了 iterator 接口,所以可以使用『扩展运算符』和『for…of…』进行遍历。

14.1 声明一个集合

// 声明一个空集合
    let s1 = new Set()
    console.log(s1, typeof s1)
    // 声明集合的同时可以传入一个参数(可迭代数据),作为集合的初始数据
    // 由于集合中不能有重复元素,所以集合会自动为我们去重
    let s2 = new Set([1,2,3,4,5,5,6,6,6,6,6])
    console.log(s2)

14.2 集合的属性和方法

1、size 返回集合的元素个数

2、add 增加一个新元素,返回当前集合

3、delete 删除元素,返回 boolean 值

4、has 检测集合中是否包含某个元素,返回 boolean 值

5、clear 清空集合,返回 undefined

let s2 = new Set([1,2,3,4,5,5,6,6,6,6,6])
    console.log(s2)
    // 1、size 返回集合的元素个数
    console.log(s2.size)
    // 2、add 增加一个新元素,返回当前集合
    console.log(s2.add(7))
    // 3、delete 删除元素,返回 boolean 值
    console.log(s2.delete(6))
    console.log(s2)
    // 4、has 检测集合中是否包含某个元素,返回 boolean 值
    console.log(s2.has(6))
    // 5、clear 清空集合,返回 undefined
    console.log(s2.clear())
    console.log(s2)

14.3 for of 遍历

let s2 = new Set([1,2,3,4,5,5,6,6,6,6,6])
      console.log(s2)
      for (const iterator of s2) {
        console.log(iterator)

14.4 使用扩展运算符

let s2 = new Set([1,2,3,4,5,5,6,6,6,6,6])
      console.log(s2)
      console.log(...s2)

14.5 集合实践

14.5.1 数组去重

14.5.2 交集

14.5.3 并集

14.5.4 差集

代码:

const arr1 = [1, 2, 3, 4, 5, 4, 3, 2, 1]
      const arr2 = [4, 5, 4, 6, 6]
      // ### 14.5.1 数组去重
      const res_arr1 = [...new Set(arr1)]
      console.log(res_arr1)
      // ### 14.5.2 交集
      const set1 = new Set(arr1)
      const set2 = new Set(arr2)
      // 在set1中也在set2中
      const res_arr2 = [...set2].filter( item=>{
        if ( set1.has(item) ) return true
        else return false
      } )
      // 简写
      // const res_arr2 = [...set2].filter((item) => set1.has(item))
      console.log(res_arr2)
      // ### 14.5.3 并集
      // 两个集合的合并
      const res_arr3 = [...set1, ...set2]
      console.log(res_arr3)
      // ### 14.5.4 差集
      // 求 set1 - set2
      // 在set1中不在set2中
      // set1中含有,判断set2中是否含有,有则过了,set2中没有则保留
      const res_arr4 = [...set1].filter((item) => !(set2.has(item)))
      console.log(res_arr4)

15. Map

ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 也实现了iterator 接口,所以可以使用『扩展运算符』和『for…of…』进行遍历。

15.1 Map 声明

let map = new Map()

15.2 向Map中添加元素(键值对)

// 字符串为键, 字符串为值
      map.set('name', 'zs')
      // 字符串为键,函数为值
      map.set('f1', function () {
        console.log('Hello Map')
      })
      // 对象为键,数组为值
      const key = {
        age: 12,
      }
      map.set(key, ['a', 1, 2])
      console.log(map)

15.3 获取元素

console.log(map.get('name'))
      console.log(map.get('f1'))
      console.log(map.get(key))

15.4 Map的其他属性和API

// 获取Map的大小
      console.log(map.size)
      // 删除键值对
      map.delete('name')
      console.log(map)
      // 清空Map
      map.clear()
      console.log(map)

15.5 for of 遍历

for (const iterator of map) {
        console.log(iterator)
      }

遍历的结果为数组,数组的第一个元素为键,第二个元素为值。

15.6 扩展运算符

console.log(...map

相关文章
|
3月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
302 1
|
6月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
515 1
|
3月前
|
存储 算法 容器
set_map的实现+set/map加持秒杀高频算法题锻炼算法思维
`set`基于红黑树实现,支持有序存储、自动去重,增删查效率为O(logN)。通过仿函数可自定义排序规则,配合空间配置器灵活管理内存。不支持修改元素值,迭代器失效需注意。`multiset`允许重复元素。常用于去重、排序及查找场景。
|
7月前
|
存储 JavaScript 前端开发
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
381 121
|
10月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
291 2
|
7月前
|
存储 C++ 容器
unordered_set、unordered_multiset、unordered_map、unordered_multimap的介绍及使用
unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。在unordered_set中,元素的值同时也是唯一地标识它的key。在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的key,unordered_set将相同哈希值的键值放在相同的桶中。unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。它的迭代器至少是前向迭代器。前向迭代器的特性。
342 0
|
7月前
|
编译器 C++ 容器
用一棵红黑树同时封装出map和set
再完成上面的代码后,我们的底层代码已经完成了,这时候已经是一个底层STL的红黑树了,已经已符合库里面的要求了,这时候我们是需要给他穿上对应的“衣服”,比如穿上set的“衣服”,那么这个穿上set的“衣服”,那么他就符合库里面set的要求了,同样map一样,这时候我们就需要实现set与map了。因此,上层容器map需要向底层红黑树提供一个仿函数,用于获取T当中的键值Key,这样一来,当底层红黑树当中需要比较两个结点的键值时,就可以通过这个仿函数来获取T当中的键值了。我们就可以使用仿函数了。
108 0
|
7月前
|
存储 编译器 容器
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
288 0
|
11月前
|
编译器 容器
哈希表模拟封装unordered_map和unordered_set
哈希表模拟封装unordered_map和unordered_set