ECMAScript 5.1 版本下对 javascript 数组元素的扩展方法(四)
前面分3篇博文介绍了 Ecmascript 5.1 数组扩展方法
ECMAScript 5.1 版本下对 javascript 数组元素的扩展方法(一)
ECMAScript 5.1 版本下对 javascript 数组元素的扩展方法(二)
ECMAScript 5.1 版本下对 javascript 数组元素的扩展方法(三)
今天和大家分享数组中关于归并的2个扩展方法 reduce , reduceRight
我们逐一简绍
reduce
此扩展函数相比其他方法略繁琐一点.
reduce(callbak(previous, current, index, array, [initialValue])
[initialValue] 值被方括号包括,表示是一个可选参数,
前四个参数分别是 previous 前值, current 当前值, index 索引, array 数组实例
什么是前值?
这个值在初始时,如果 initialValue 有值,那么 previous = initialValue , 如果 initialValue 参数缺少时, previous 默认值为数组第一个元素值.
当 reduce 在迭代每个元素时,会把 callback 返回的值当做参数继续传给 callback 来执行.
这里好诡异,这就是这个函数很难理解的部分,你可以把它看做是 数组元素迭代 + callback 递归
每次callback执行后的结果赋值给 previous (初始值是 initialValue 或者 数组第一个元素,见 上面 前值的说明 )
每次迭代的数组元素赋值给 current 参数
index 是当前迭代元素所在的索引
array 就是数组实例本身
理解了参数后,我们看一个实例:
var a=[10,9,5,40]; var sum=a.reduce(function (previous, current, index, array) { return previous + current; }); console.log('****',sum);
迭代相加后结果是 64
看下执行过程:
// 初始设置 previous = 10, current = 9 // 第一次迭代 previous = (10 + 9) = 19, current = 5 // 第二次迭代 previous = (19 + 5) = 24, current = 40 // 第三次迭代 previous = (24 + 40) = 64, current = undefined (退出)
当你所在的浏览器环境不支持 Ecmascript 5.1时,需要自己手动扩展一个 reduce 方法.
if (typeof Array.prototype.reduce != "function") { Array.prototype.reduce = function (callback, initialValue ) { var previous = initialValue, k = 0, length = this.length; if (typeof initialValue === "undefined") { previous = this[0]; k = 1; } if (typeof callback === "function") { for (k; k < length; k++) { this.hasOwnProperty(k) && (previous = callback(previous, this[k], k, this)); } } return previous; }; }
需要注意的部分:
如果 initialValue 参数不存在时, previous初始值为数组第一个元素 this[0]
k 的值,请注意 k 是从1开始的.虽然reduce 也在遍历迭代数组,但是它是跳过第一个元素的. (请看上面的执行过程 )
2. reduceRight
这个方法和 reduce 有何不同?
用户一样,没有太大不同,唯一的区别是 reduce 是从左向右遍历迭代, reduceRigth 是从右向左遍历迭代而已.
所以,省略了一些内容,大家对比上面的 reduce 来学习即可.