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 应用场景
- 累加数组元素(函数复合也可以)
- 构建对象:当你需要根据数组中的元素构建一个对象时,例如,将数组的每个元素转换成一个对象属性。
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' }
- 滤除或转换元素:在处理筛选或转换数组元素的过程中,如果最终需要一个单一的值作为结果,可以使用
reduce
。 - 排序和分组:
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
的区别哈
两个变量声明:
let key = JSON.stringify(args);
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 失败的的场景,以便合理处理异步操作的结果。