javascript之reduce的高阶用法

作者: 子龙0322 | 来源:发表于2018-11-20 11:01 被阅读20次

很长的时间内,我一直以为数组的 reduce 用法,正如其名的含义一样,输出结果会“reduce”为一个值;以为reduce只能做些汇总求和之类的计算:

function sum(a, b) {
    return a + b;
}
const arr = [1, 2, 3, 4, 5];
arr.reduce(sum); // 15

对以上写法不熟悉数的朋友,可先看文章《javascript之高阶函数》

直到有天我得知,原来 reduce 还有第二个可选参数;原来 reduce 不单能实现 filter 和 map 的功能,还能实现 filter + map 的功能!


用法: arr.reduce(callback[, initialValue]);

  • callback 为遍历数组时的回调函数。
    • callback有四个参数:callback(accumulator, currentValue[, currentIndex, array])
    • accumulator 为遍历时,上次callback的返回值;若有 initialValue 参数时,accumulator 的初始值为 initialValue;若无 initialValue 参数时,accumulator 初始值为数组的第一个元素。
    • currentValue 为 callback 遍历数组时的当前元素;若有 initialValue 参数时,currentValue 的初始值为数组的第一个元素;若无 initialValue 参数时,currentValue 初始值为数组的第二个元素。
  • initialValue 为指定 callback 初始遍历时 accumulator 的值。

下例,我们用 reduce 实现 filter + map 的功能:

// 找出 sex 为 female 的对象,并为其增加 weight_age 字段
const data = [
  {name: 'a', age: 37, weight: 72, sex: 'male'},
  {name: 'b', age: 17, weight: 64, sex: 'male'},
  {name: 'c', age: 24, weight: 89, sex: 'female'},
  {name: 'd', age: 66, weight: 83, sex: 'male'},
  {name: 'e', age: 47, weight: 105, sex: 'male'},
  {name: 'f', age: 18, weight: 61, sex: 'female'}
];

const result = data.reduce((accumulator, currentValue) => {

  // if 判断,相当于 filter
  if (currentValue.sex === 'female') {

    // 为 currentValue 增加字段,相当于 map
    currentValue.weight_age = currentValue.weight - currentValue.age;
    accumulator.push(currentValue);
  }
  return accumulator;
}, []);

console.log(result); 
// [
//  {name: "c", age: 24, weight: 89, sex: "female", weight_age: 65}, 
//  {name: "f", age: 18, weight: 61, sex: "female", weight_age: 43}
// ]



同理,开篇求汇总值的例子,也可为其添加汇总初始值:

function sum(a, b) {
    return a + b;
}
const arr = [1, 2, 3, 4, 5];
arr.reduce(sum, 10); // 25

相关文章

  • javascript之reduce的高阶用法

    很长的时间内,我一直以为数组的 reduce 用法,正如其名的含义一样,输出结果会“reduce”为一个值;以为r...

  • Swift 高阶函数

    高阶函数之Reduce public func reduce(_ initialResult: R...

  • 2019-01-24记录

    计算函数被执行次数 ---- javascript reduce()函数的用法(): reduce函数可 接受一个...

  • Swift中 高阶函数reduce解析

    Swift 引入了一些高阶函数,比如map、filter、reduce,今天简单介绍一下reduce的用法. re...

  • JavaScript 高阶函数reduce

    用法: Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须...

  • Python学习笔记06-函数式编程

    高阶函数 下面介绍一下函数的高级用法,包括Map/Reduce、filter、sorted、lambda、deco...

  • Python sorted

    上一篇我们学习了python的高阶函数和map,reduce的用法,今天我们来看另一个高阶函数 sorted。 排...

  • Python高阶函数_map/reduce/filter

    本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 ...

  • js 高阶函数

    filter map reduce filter 高阶函数的用法 filter 中的回调函数有一个要求:必须返回...

  • javascript高阶特性

    javascript高阶特性之-curry化(柯里化) javascript高阶特性-串行执行promises j...

网友评论

    本文标题:javascript之reduce的高阶用法

    本文链接:https://www.haomeiwen.com/subject/uurtqqtx.html