注册

reduce() 方法详解

作者:admin - 时间:18-04-03 10:16 - 阅读量:73 - 评论:1

概述

reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

语法

arr.reduce([callback, initialValue])

  • callback (执行数组中每个值的函数,包含四个参数)
  • initialValue (作为第一次调用 callback 的第一个参数。)

看一个小栗子

[0,1,2,3,4].reduce((prev,cur,index,array) => {
    return prev + cur;
});

回调被执行四次,每次的参数和返回值如下表:

previousValue currentValue index arry return value
first call 0 1 0 [0,1,2,3,4] 1
second call 1 2 1 [0,1,2,3,4] 3
third call 3 3 2 [0,1,2,3,4] 6
fourth call 6 4 3 [0,1,2,3,4] 10

回调函数的四个参数:

  • prev: 第一项的值或者上一次叠加的结果值
  • cur: 当前会参与叠加的项
  • index: 当前值的索引
  • arr: 数组本身

对prev和cur理解

prev表示每次叠加之后的结果,类型可能与数组中的每一项不同,而cur则表示数组中参与叠加的当前项。

我们看下面一个例子。

某同学的期末成绩如下表示

var result = [
    {
        subject: 'math',
        score: 88
    },
    {
        subject: 'chinese',
        score: 95
    },
    {
        subject: 'english',
        score: 80
    }
];

如何求该同学的总成绩呢?

我们用reduce来搞定这个问题

var sum = result.reduce((prev,cur) => {
    return cur.score + prev;
},0);

这第二个参数就是设置prev的初始类型和初始值,比如为0,就表示prev的初始值为number类型,值为0,因此,reduce的最终结果也会是number类型。

我们来给这个例子增加一点难度。假如该同学的总成绩中,各科所占的比重不同,分别为50%,30%,20%,我们应该如何求出最终的权重结果呢?

解决方案如下:

let dis = {
    math:0.5,
    chinese:0.3,
    english:0.2
};

var qsum = result.reduce((prev,cur) => {
    return dis[cur.subject] * cur.score + prev;
},0);
```js

问如何知道一串字符串中每个字母出现的次数?
```js
let str = "aabbbcccc";
str.split('').reduce((prev,cur) => {
    prev[cur] ? prev[cur]++ : prev[cur] = 1;
   return prev; 
},{});


评论 一共有0条评论



登 录
注 册