JS reduce基本使用及高阶函数compose

本文介绍了JavaScript中reduce方法的基本用法,通过累加示例帮助理解其工作原理。接着,文章探讨了如何利用reduce实现compose函数,用于依次执行多个函数。通过compose函数,可以优雅地处理多个函数调用的问题,这一概念在Redux等库中有所应用。

先介绍下reduce基本用法:

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

这里注意,reduce() 方法接受一个函数作为累加器

先看两个例子,理解下是否设置初始值的情况:

var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
})
console.log(arr, sum);
// 打印结果
// 1 2 1
// 3 3 2
// 6 4 3
// [1, 2, 3, 4] 10
var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
}, 1)
console.log(arr, sum);
// 打印结果
// 1 1 0
// 2 2 1
// 4 3 2
// 7 4 3
// [1, 2, 3, 4] 11

常见的用法:现在有一个数组,实现累加:

var array1 = [1, 2, 3, 4];
// 这里我们定义一个累加器函数,作为reduce的参数
var reducer = (accumulator, currentValue) => accumulator + currentValue;
console.log("result:", array1.reduce(reducer)); 
// result: 10

上面的用法比较基础,先理解熟悉基本用法,下面我们来看看,在reduce是如何实现compose的:
假如现在有三个方法,f1、f2、f3,这三个函数参数相同,需要得到依次执行这三个函数的结果。

function f1(arg) {
  console.log("f1", arg);
  return arg;
}
function f2(arg) {
  console.log("f2", arg);
  return arg;
}
function f3(arg) {
  console.log("f3", arg);
  return arg;
}
f3(f2(f1('yuan'))); // "yuan"

如果有多个函数呢,是不是需要一直这么“不优雅”的写下去?我们再看看是不是觉得这种情况和上面的累加比较类似?这里的多个函数就类似累加中的数组,让我们尝试用reduce来解决。我们封装一个函数:

function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg;
  }
  if (funcs.length === 1) {
    return funcs[0];
  }
  // args是将参数一层一层传下去
  return funcs.reduce((a, b) => (...args) => {
    return a(b(...args));
  });
}
var dispatch = compose(f1, f2, f3);
dispatch('yuan');

好好理解下这个compose函数,这也是一个比较常见的高阶聚合函数,在redux源码中有应用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值