【js自学打卡4】

reduce() | …arg | Promise.all

1.关于reduce()

1.1 基本概念

reduce 是 JavaScript 中一个非常有用的数组方法,它用于将数组中的所有元素归纳为一个值。它接收一个函数作为累加器,该函数有两个参数:累加值和当前元素值。每次迭代时,累加值都会与当前元素值结合,最终返回一个单一的值。
reduce 方法的基本语法如下:

array.reduce(function(accumulator, currentValue, currentIndex, array) {
  // 返回结果会被分配给累加器,作为下一次运行回调时的第一个参数
  return accumulator + currentValue;//也可以返回别的。这里是个例子
}, initialValue);
  • accumulator:累加器累加回调的返回值; 它是上一次调用回调时返回的累积值,或者是提供的初始值(initialValue)。
  • currentValue:数组中正在处理的当前元素。
  • currentIndex(可选):数组中正在处理的当前元素的索引。
  • array(可选):调用 reduce 方法的数组。
  • initialValue(可选):作为第一次调用回调函数时的第一个参数的值。

使用箭头函数:

const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, val) => acc + val, 0);
console.log(sum); // 输出:15

1.2 应用场景

  1. 累加数组元素(函数复合也可以)
  2. 构建对象:当你需要根据数组中的元素构建一个对象时,例如,将数组的每个元素转换成一个对象属性。
const data = ['apple', 'banana', 'cherry'];

const result = data.reduce((accumulator, currentValue) => {
  accumulator[currentValue] = currentValue;
  return accumulator;
}, {});

console.log(result); // 输出:{ apple: 'apple', banana: 'banana', cherry: 'cherry' }
  1. 滤除或转换元素:在处理筛选或转换数组元素的过程中,如果最终需要一个单一的值作为结果,可以使用reduce
  2. 排序和分组reduce可以用来对数组元素进行排序或者分组。

1.3 reduceRight()

从右到左应用。
力扣2629 复合函数

var compose = function(functions) {
    return x => functions.reduceRight((acc, f) => f(acc), x);
};

2. 关于…arg

Rest参数的用法。表示函数接收任意数量的参数,并放到一个数组中。

2.1 一点用法错误

力扣2623 记忆函数
在这里记一下两个关键思路
要点在于键唯一性存储查值,一是map(哈希表和has)二是对象属性(hasOwnProperty)

这里用到了JSON.stringify,后面不小心用的是...args结果爆了。
看一下args...args的区别哈

两个变量声明:

  1. let key = JSON.stringify(args);
  2. let key = JSON.stringify(...args);
    第一个声明直接调用 JSON.stringify 函数,并将结果赋给变量 key。这里的 args 是一个数组,JSON.stringify 会将整个数组转换为一个JSON字符串,包括数组索引和元素。
    第二个声明使用了扩展运算符 ... 来解包 args 数组,并将解包后的元素作为单独的参数传递给 JSON.stringify 函数。这意味着 JSON.stringify 不会看到一个数组,而是看到一组独立的元素。因此,如果 args 数组包含多个元素,JSON.stringify(...args) 将返回一个包含所有元素JSON字符串的字符串,这些元素之间用逗号分隔,并且前面会有一个 [ 和一个 ] 符号。
    例如,如果 args 是一个包含多个元素的数组:
let args = [1, 2, 3];
let key1 = JSON.stringify(args); // "["1","2","3"]"
let key2 = JSON.stringify(...args); // "{"0":1,"1":2,"2":3}"

在这个例子中,key1 是一个字符串,包含一个表示数组的JSON字符串。而 key2 是一个对象,它的键是数组索引,值是数组元素。这种差异在处理数组和对象时非常重要,因为它们会导致不同的JSON表示。

简单来说,数组直接被原封不动打成字符串,但用了…的会被作为对象处理。两者的打印结果并不一致。

3.Promise.all()

Promise.all 是一个 JavaScript 中的异步编程方法,用于处理多个 Promise 实例,当这些 Promise 都完成后,Promise.all 会返回一个新的 Promise,它包装了所有原始 Promise 的结果数组。如果任何一个 Promise 被拒绝(rejected),那么 Promise.all 也会立即被拒绝,且不会返回任何结果。
下面是 Promise.all 的一些基本用法:

// 创建三个 Promise 实例
const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('Promise 1'), 1000);
});
const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('Promise 2'), 2000);
});
const promise3 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('Promise 3'), 3000);
});
// 使用 Promise.all 处理这三个 Promise
Promise.all([promise1, promise2, promise3])
  .then(results => {
    // 当所有 Promise 都完成后,这里会接收到一个包含所有结果的数组
    console.log(results); // ['Promise 1', 'Promise 2', 'Promise 3']
  })
  .catch(error => {
    // 如果任何一个 Promise 被拒绝,这里会捕获到错误
    console.error(error);
  });

需要注意的是,使用 Promise.all 时,如果传入的数组中任何一个元素不是 Promise,那么这个方法会抛出一个类型错误(TypeError)。另外,如果传入的 Promise 中任何一个被拒绝,那么 Promise.all 也会被拒绝,且不会返回任何结果。
在使用 Promise.all 时,应该考虑到所有 Promise 都成功的场景和任何一个 Promise 失败的的场景,以便合理处理异步操作的结果。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值