ECMAScript 5 還新增了兩個歸并數(shù)組的方法: reduce() 和 reduceRight() 赊豌。這兩個方法都會迭
代數(shù)組的所有項绩卤,然后構(gòu)建一個最終返回的值。其中壹甥, reduce() 方法從數(shù)組的第一項開始,逐個遍歷
到最后壶熏。而 reduceRight() 則從數(shù)組的最后一項開始句柠,向前遍歷到第一項。
這兩個方法都接收兩個參數(shù):一個在每一項上調(diào)用的函數(shù)和(可選的)作為歸并基礎的初始值棒假。傳
給 reduce() 和 reduceRight() 的函數(shù)接收 4 個參數(shù):前一個值溯职、當前值、項的索引和數(shù)組對象帽哑。這
個函數(shù)返回的任何值都會作為第一個參數(shù)自動傳給下一項谜酒。第一次迭代發(fā)生在數(shù)組的第二項上,因此第
一個參數(shù)是數(shù)組的第一項妻枕,第二個參數(shù)就是數(shù)組的第二項僻族。
使用 reduce() 方法可以執(zhí)行求數(shù)組中所有值之和的操作,比如:
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){
return prev + cur;
});
alert(sum); //15
第一次執(zhí)行回調(diào)函數(shù)屡谐, prev 是 1述么, cur 是 2。第二次愕掏, prev 是 3(1 加 2 的結(jié)果)碉输, cur 是 3(數(shù)組
的第三項)。這個過程會持續(xù)到把數(shù)組中的每一項都訪問一遍亭珍,最后返回結(jié)果。
reduceRight() 的作用類似枝哄,只不過方向相反而已肄梨。來看下面這個例子。
var values = [1,2,3,4,5];
var sum = values.reduceRight(function(prev, cur, index, array){
return prev + cur;
});
alert(sum); //15
在這個例子中挠锥,第一次執(zhí)行回調(diào)函數(shù)众羡, prev 是 5, cur 是 4蓖租。當然粱侣,最終結(jié)果相同羊壹,因為執(zhí)行的都
是簡單相加的操作。
使用 reduce() 還是 reduceRight() 齐婴,主要取決于要從哪頭開始遍歷數(shù)組油猫。除此之外,它們完全
相同柠偶。
支持這兩個歸并函數(shù)的瀏覽器有 IE9+情妖、Firefox 3+、Safari 4+诱担、Opera 10.5 和 Chrome毡证。
實例:
計算數(shù)組中每個元素出現(xiàn)的次數(shù)
var names = ['蓋倫','趙信','嘉文','德萊厄斯','蓋倫'];
var countedNames = names.reduce(function(allNames, name){if(name in allNames) {? ?
?allNames[name]++;? }else{? ?
?allNames[name] =1;? }return allNames;}, {});
// countedNames is:// { '蓋倫': 2, '趙信': 1, '嘉文': 1, '德萊厄斯': 1 }
封裝成數(shù)組的一個方法
Array.prototype.countTimes =function(){return this.reduce(function(obj,name){if(name in obj){? ?
obj[name]++;? ? ? ? }else{? ? ? ? ? ??
obj[name] =1;? ? ? ? }return obj;? ??
},{});}