本文详细介绍ECMAScript5新增的数组归并方法reduce()和reduceRight()。两者均通过迭代数组构建最终值,区别在于遍历方向:前者从第一项至最后一项,后者反向执行。文章解析了回调函数的四个参数及初始值作用,并通过代码示例展示求和逻辑,同时补充了浏览器兼容性信息及归并排序的概念。
ECMAScript5数组归并方法概述
ECMAScript5规范为数组类型引入了两个归并方法:reduce()和reduceRight()。这两个方法的核心功能都是遍历数组中的每一项,并通过回调函数的处理构建出一个最终返回值。其中,reduce()方法按照数组索引从小到大的顺序,从第一项开始逐个遍历至最后一项;而reduceRight()方法则执行相反的操作,从数组的最后一项开始,逆向遍历至第一项。
参数详解与迭代机制
这两个方法都接受两个参数:一个在数组每一项上调用的回调函数,以及一个可选的作为归并基础的初始值。传递给reduce()和reduceRight()的回调函数包含四个参数:前一个累加值(prev)、当前处理项(cur)、当前项的索引(index)以及数组对象本身(array)。回调函数返回的任何值,都会自动作为下一次迭代中前一个累加值(prev)的参数传入。需要注意的是,如果未指定初始值,第一次迭代将发生在数组的第二项上,此时前一个累加值默认为数组的第一项,当前处理项为数组的第二项。
reduce()方法应用示例
例如,我们可以利用reduce()方法计算数组中所有数值的总和。
var nums = [1,2,3,4,5];
var sum = nums.reduce(function(prev,cur,index,array){
retrun pre + cur;
});
在上述代码执行过程中,第一次调用回调函数时,前一个累加值prev为1,当前项cur为2。第二次迭代时,prev变为3(即1+2的结果),cur为3。reduce()方法会持续重复这一过程,直到遍历完数组中的每一项,最终将计算结果赋值给变量sum。
reduceRight()方法反向执行示例
reduceRight()方法的逻辑与reduce()类似,唯一的区别在于其遍历方向是反向的。具体示例如下:
var nums = [1,2,3,4,5];
var sum = nums.reduceRight(function(prev,cur,index,array){
retrun pre + cur;
});
在该示例中,第一次执行回调函数时,前一个累加值prev为5,当前项cur为4。尽管遍历方向相反,但最终求和的结果与使用reduce()方法得到的结果一致,均为15。
浏览器兼容性支持
关于浏览器兼容性,支持reduce()和reduceRight()方法的浏览器版本包括:IE9及以上、Firefox3及以上、Safari4及以上、Opera10.5及以上以及Chrome。
补充说明与归并排序概念
补充说明
ECMAScript5标准还引入了另外两个数组归并方法:reduce()和reduceRight()。
这两个方法都会对数组的所有项进行迭代处理。其中,reduce()方法从数组的第一项开始,逐个遍历至最后一项;而reduceRight()方法则从数组的最后一项开始,逆向遍历至数组的第一项。
这两个方法均接受两个参数:一个在每一项上调用的函数(该函数接收前一个值、当前值、项的索引、数组对象作为参数)以及作为归并基础的初始值。
该回调函数返回的任何值都会自动作为下一次迭代中的前一个值(prev)传入。第一次迭代发生在数组的第二项上,因此前一个值参数对应数组的第一项,当前值参数对应数组的第二项。结合可选的初始值,使用reduce()方法可以方便地执行数组中所有值的求和操作,例如:
var values = [1, 2, 3, 4, 5];
var sum = values.reduce(function (prev, cur, index, array) {
return prev + cur;
});
alert(sum);
//结果一样,只是方向相反而已
var sum2=values.reduceRight(function (prev,cur,index,array) {
return prev+cur;
});
alert(sum2);
归并排序(Merge sort)是一种基于归并操作的高效排序算法。该算法是分治法(Divide and Conquer)的一个典型应用。
归并(Merge)排序法的核心思想是将两个或多个有序表合并成一个新的有序表。具体做法是将待排序序列划分为若干个子序列,确保每个子序列内部有序,然后再将这些有序子序列合并为整体有序的序列。
归并排序是建立在归并操作上的一种有效排序算法,也是分治法(Divide and Conquer)的典型应用。其过程是将已有序的子序列合并,从而得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,则称为2-路归并。