es 5 数组reduce方法记忆

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

概念:对数组中的所有元素调用指定的回调函数。该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。

语法:

array1.reduce(callbackfn[, initialValue])

参数:

参数

定义

array1

必需。一个数组对象。

callbackfn

必需。一个接受最多四个参数的函数。对于数组中的每个元素,reduce 方法都会调用 callbackfn 函数一次。

initialValue

可选。如果指定 initialValue,则它将用作初始值来启动累积。第一次调用 callbackfn 函数会将此值作为参数而非数组值提供。

返回值

通过最后一次调用回调函数获得的累积结果。

异常

当满足下列任一条件时,将引发 TypeError 异常:

  • callbackfn 参数不是函数对象。
  • 数组不包含元素,且未提供 initialValue

备注

如果提供了 initialValue,则 reduce 方法会对数组中的每个元素调用一次 callbackfn 函数(按升序索引顺序)。如果未提供 initialValue,则reduce 方法会对从第二个元素开始的每个元素调用 callbackfn 函数。

回调函数的返回值在下一次调用回调函数时作为 previousValue 参数提供。最后一次调用回调函数获得的返回值为 reduce 方法的返回值。

不为数组中缺少的元素调用该回调函数。

注意

reduceRight 方法 (Array) (JavaScript)按降序索引顺序处理元素。

回调函数语法

回调函数的语法如下所示:

function callbackfn(previousValue, currentValue, currentIndex, array1)

可使用最多四个参数来声明回调函数。

下表列出了回调函数参数。

回调参数

定义

previousValue

通过上一次调用回调函数获得的值。如果向 reduce 方法提供 initialValue,则在首次调用函数时,previousValue 为initialValue。

currentValue

当前数组元素的值。

currentIndex

当前数组元素的数字索引。

array1

包含该元素的数组对象。

第一次调用回调函数

在第一次调用回调函数时,作为参数提供的值取决于 reduce 方法是否具有 initialValue 参数。

如果向 reduce 方法提供 initialValue

  • previousValue 参数为 initialValue
  • currentValue 参数是数组中的第一个元素的值。

如果未提供 initialValue

  • previousValue 参数是数组中的第一个元素的值。
  • currentValue 参数是数组中的第二个元素的值。

修改数组对象

数组对象可由回调函数修改。

下表描述了在 reduce 方法启动后修改数组对象所获得的结果。

reduce 方法启动后的条件

元素是否传递给回调函数

在数组的原始长度之外添加元素。

否。

添加元素以填充数组中缺少的元素。

是,如果该索引尚未传递给回调函数。

元素被更改。

是,如果该元素尚未传递给回调函数。

从数组中删除元素。

否,除非该元素已传递给回调函数。

如果单纯看概念,一看就会头晕,但是看示例demo及输出,则对reduce的作用一目了然。

example:

[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
});

//10

[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
},10);

//20
  [1].reduce(function(previousValue, currentValue, index, array){
    return previousValue + currentValue;
   },20);


  //21


//如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。[至少有一个值为  “ 有 ”]

  [1].reduce(function(previousValue, currentValue, index, array){
    return previousValue + currentValue;
   });

  //1

[].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
},2);
//2

[null].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
},2);
//2

//如果出现值为Undefined,则输出NaN

[undefined].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
},2);
//NaN

[1].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
},undefined);
NaN


//如果数组为空并且没有提供initialValue, 会抛出TypeError [两个值都没有]

[].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
});
例子:将数组所有项相加

var total = [0, 1, 2, 3].reduce(function(a, b) {
    return a + b;
});

console.log(total);
// total == 6
例子: 数组扁平化

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
    return a.concat(b);
});
console.log(flattened);
// flattened is [0, 1, 2, 3, 4, 5]

参考:http://www.cnblogs.com/leejersey/p/5466091.html

https://msdn.microsoft.com/library/ff679975(v=vs.94).aspx

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

窥探Swift之别样的枚举类型

  想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了。Fundation框架和UIKit中的枚举更是数不胜数,枚举可...

2037
来自专栏ccylovehs

JavaScript基础回顾一(类型、值和变量)

没有答对也不要灰心,本文会巩固你的基础知识,后续会有系列的基础回顾知识,以飨诸君!

752
来自专栏黑泽君的专栏

关于Java面向对象的分析题

分析程序看有没有问题,如果有,说出原因即可。 ---------------------------------------------------------...

1211
来自专栏deed博客

day02笔记

1442
来自专栏程序你好

Java中Null Object 设计模式

今天,我将讨论较少使用的空对象模式。在面向对象编程中,我们经常处理空对象。空对象是指没有任何引用的对象,或者定义为中性/空功能/行为的对象。在访问任何成员或调用...

3214
来自专栏和蔼的张星的图像处理专栏

655. 大整数加法

以字符串的形式给出两个非负整数 num1 和 num2,返回 num1 和 num2 的和。 注意事项: num1 和 num2 的长度都小于5100。 ...

991
来自专栏C++

python笔记:#005#算数运算符

1562
来自专栏木木玲

PriorityQueue 源码分析

4126
来自专栏小樱的经验随笔

STL中的nth_element()方法的使用

STL中的nth_element()方法的使用 通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从...

2954
来自专栏用户画像

Java int 最大值 最小值

从JDK1.0开始,Integer中就定义了MIN_VALUE和MAX-VALUE两个常量:

4431

扫码关注云+社区

领取腾讯云代金券