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方法 如果是如下情况,请考虑使用 ...
随机推荐
- STM32开发/烧录/调试环境搭建 基于:Win10+STM32Cube+openocd+cmsis-dap(dap-link)
dap-link是个不错的STM32下载/调试工具,然而STM32Cube并没有直接支持它,只能通过openocd的方式间接支持. 网络上虽然已经有了其他人的教程,不过基本都是基于linux或者msy ...
- 粘包和拆包及Netty解决方案
在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...
- Windows10 64位部署odoo12开发环境
预装Windows10 64位家庭版电脑一台 2019年7月 安装Python,这里的版本选择上有个坑,不要装最新的Python 3.7.x,原因是odoo12依赖pillow 4.0.0库,而这个4 ...
- 标签一致项(LC-KSVD)-全文解读
Learning A Discriminative Dictionary for Sparse Coding via Label Consistent K-SVD 1,同步学习判决字典和线性分类器 2 ...
- NodeJS添加Jquery依赖
NodeJS使用时有时候需要JQuery依赖. 新版正确的依赖方式 var jsdom = require('jsdom'); const {JSDOM} = jsdom; const {docume ...
- maven打包产生可执行jar包
http://blog.csdn.net/u014695188/article/details/53128095 https://blog.csdn.net/fuck487/article/detai ...
- 关于wordpress4.8中的Twenty Seventeen主题的主题选项增加章节的实现
我这里的wordpress版本是4.8 默认的主题是 Twenty Seventeen 我想实现的事 主题选项的首页 多增加2个章节 默认是只有4个章节 我想在增加2个 到6个 看下实现后的效果 ...
- thinkphp 分页类 url 编码处理
在做thinkphp分页的时候 thinkphp 中的分页 有一个小问题 就是 在有form 表单 搜索中文的时候,点击下一页的话 中文会被转换成编码. 如图: 最直接的方法就是 直接修改 thin ...
- sql 简单分页查询(ror_number() over)
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY ID DESC ) AS r_num FROM (select * from #table ...
- aspose.cells导出Demo
/// <summary> /// 导出excel /// </summary> /// <param name="list"></par ...