reduce方法和reduceRight方法
什么是reduce方法?
先来看一下用用法:
var arr = [1, 2, 3, 4]
var sum = (a, b) => a + b
arr.reduce(sum, 0) //
由上面代码可以看出,reduce对数组arr的每一个成员执行了sum函数。sum的参数a是累积变量,参数b是当前的数组成员。每次执行时,b会回到a,最后输出a。
累积变量必须有一个初始值,上例是reduce函数的第二个参数0,如果省略该参数,那么初始值默认是数组的第一个成员。
var arr = [1, 2, 3, 4]
var sum = function(a, b) {
console.log(a, b);
return a + b
}
arr.reduce(sum) // => 10
// 1 2
// 3 3
// 6 4
reduce省略了初始值,通过sum函数里面的打印语句,可以看到累积变量每一次的变化。reduce方法提供了一种遍历手段,对数组所有成员进行‘累积’处理。
既然是遍历,那它跟 for 、 while有什么不同呢?
for :
var arr = [1, 2, 3, 4]
Array.prototype.sum = function () {
var sumResult = 0;
for (var i = 0; i < this.length; i++) {
sumResult += parseInt(this[i]);
}
return sumResult;
} arr.sum(); //
while
var arr = [1, 2, 3, 4]
Array.prototype.sum = function() {
var sumResult = 0;
var i = this.length;
while (i--) {
sumResult += parseInt(this[i]);
}
return sumResult;
} arr.sum() //
以上代码都能实现reduce的功能,那为何还要搞这玩意呢?
一般来说类似的方法比较都会是性能方面的比较,来看看各自的耗时
var arr = [1, 2, 3, 4]
console.time('forLoop');
Array.prototype.forLoop = function() {
for (var i = 0; i < 10000; i++) {
var sumResult = 0;
for (var j = 0; j < this.length; j++) {
sumResult += parseInt(this[j]);
}
return sumResult;
}
arr.forLoop();
console.log('最终的值:' + arr.forLoop()) //
console.timeEnd('forLoop')

var arr = [1, 2, 3, 4]
console.time('whileLoop')
Array.prototype.whileLoop = function() {
var _this = this
for(var i = 0; i < 10000; i++) {
var sumResult = 0;
var len = _this.length;
while(len--) {
sumResult += parseInt(_this[len]);
}
}
return sumResult;
}
arr.whileLoop()
console.log('最终的值:' + arr.whileLoop())
console.timeEnd('whileLoop')

经多次运行测试发现 10000次运行使用for循环 和while的时间大致相当,大概需要 4 - 7ms 不等!
那reduce呢?
var arr = [1, 2, 3, 4]
console.time('reduce')
Array.prototype.reduceSum = function() {
for (var i = 0; i < 10000; i++) {
return this.reduce(function(preValue, curValue) {
return preValue + curValue;
});
}
}
arr.reduceSum();
console.log('最终的值:' + arr.reduceSum()) //
console.timeEnd('reduce')

可见,时间大概在1-3ms之间,耗时情况一目了然!
reduceRight()方法
reduceRight() 方法的功能和reduce()功能是一样的,不同的是reduceRight() 从数组的末尾向前将数组中的数组项做累加。
reduceRight() 首次调用回调函数callbackfn 时,preValue 和 curValue 可以是两个值之一。如果调用reduceRight()时提供了第二个参数,则preValue等于该参数,curValue等于数组中的最后一个值。如果没有提供,则preValue等于数组最后一个值,curValue等于数组中倒数第二个值。
var arr = [0, 1, 2, 3, 4];
arr.reduceRight(function(preValue, curValue, index, array) {
console.log(preValue, curValue)
return preValue + curValue;
}); //
// 4 3
// 7 2
// 9 1
// 10 0
arr.reduceRight(function(preValue, curValue, index, array) {
console.log(preValue, curValue)
return preValue + curValue;
}, 5) //
// 5 4
// 9 3
// 12 2
// 14 1
// 15 0
相关文章: https://www.w3cplus.com/javascript/array-part-8.html 、 http://www.ruanyifeng.com/blog/2017/03/reduce_transduce.html
reduce方法和reduceRight方法的更多相关文章
- es6中reduce()方法和reduceRight()方法
es6中reduce()方法从左往右开始 参数:prev:它是上一次调用回调时返回的结果,每次调用的结果都会给prev cur:当前的元素 index:当前的索引 arr:循环的数组 返回值:函数累计 ...
- ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法
原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打 ...
- ThinkPHP的D方法和M方法的区别
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
- Hibernate中evict方法和clear方法说明
Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...
- Android HTTP实例 使用GET方法和POST方法发送请求
Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...
- virtual方法和abstract方法
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
- JavaScript indexOf() 方法和 lastIndexOf() 方法
一,定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索 ...
- wait方法和sleep方法的区别
一.概念.原理.区别 Java中的多线程是一种抢占式的机制而不是分时机制.线程主要有以下几种状态:可运行,运行,阻塞,死亡.抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行. ...
- M方法和D方法的区别
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
随机推荐
- Python-lambda使用
什么是lambda 匿名函数,不需要命名的函数: 语法 lambda 参数 : 返回值 g = lambda x: 2*x+1 g(2) >5
- CentOS7 GitLab 安装
1.安装依赖 $ yum -y install policycoreutils openssh-server openssh-clients postfix $ yum install policyc ...
- 使用maven-resources-plugin插件分环境配置
一.项目目录结构 二.pom文件中引入maven-resources-plugin插件和相关的标签 <build> <plugins> <plugin> &l ...
- ReentrantReadWriteLock可重入,锁升级,锁降级
public class ReentrantReadWriteLockTest { public static void main(String[] args) throws InterruptedE ...
- jetbrain 公司2019年全套产品的破解方案
百度网盘下载地址是:链接:https://pan.baidu.com/s/1E4E76Oglfexed0iHNiXjEQ 密码:pehx ======================== ...
- elasticsearch6设置默认分片数和副本数
elasticsearch6设置索引的默认分片数和副本数已经不是在elasticsearch.yml文件中了,而是使用了一个索引模板的东西 curl -XPUT 'http://10.27.12.16 ...
- Web应急:管理员账号被篡改
你是某一个网站的管理员,有一天,你的管理员账号admin却登录不了,进入数据库查看,原来管理员账号用户名不存在了,却多了另外一个管理员用户名.不对,不是新增了管理员,而是你的管理员用户名被篡改了. 现 ...
- Python学习笔记之使用 python -m SimpleHTTPServer 快速搭建http服务
0x00 概述 搭建FTP,或者是搭建网络文件系统,这些方法都能够实现Linux的目录共享.但是FTP和网络文件系统的功能都过于强大,因此它们都有一些不够方便的地方.比如你想快速共享Linux系统的某 ...
- js 固定div 不随着滚动条滚动
css .fixed { position: fixed; top:; } javascript function my$(id) { return document.getElementById(i ...
- spring boot 连接 Oracle 的 application的简单配置
server.port=8090 //Tomcat服务端口号spring.datasource.driver-class-name= oracle.jdbc.driver.OracleDriver / ...