reduce( ) 函数
reduce( ) 方法接受一个函数作为累加器,数组中的每个值开始处理。
1 .计算数组总和
var num = [1,2,3,4,5]; var res = num.reduce(function(total,num){ return total+num; //return total + Math.round(num);//对数组元素四舍五入并计算总和 },0); console.log(res);//15 // 没有初始值initialValue(即上面例子中的0),当数组为空时会抛出异常 提示reduce函数没有初始值,
// 所以为兼容性一般加上initialValue
2.合并二维数组
var red = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) { return a.concat(b); }, []);
3、合并多维数组
let arr = [[0, 1], [2, 3], [4,[5,6,7]]] const newArr = function(arr){ return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[]) } console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
4、对象里的属性值求和
var result = [ { subject: 'math', score: 10 }, { subject: 'chinese', score: 20 }, { subject: 'english', score: 30 } ]; var sum = result.reduce(function(prev, cur) { return cur.score + prev; }, 0); console.log(sum) //60
5、统计一个数组中有多少个不重复的单词
a)、不通过reduce实现
var arr = ["apple","orange","apple","orange","pear","orange"]; function getWordCnt(){ var obj = {}; for(var i= 0, l = arr.length; i< l; i++){ var item = arr[i]; obj[item] = (obj[item] +1 ) || 1; } return obj; }
b)、通过reduce实现
var arr = ["apple","orange","apple","orange","pear","orange"]; function getWordCnt(){ return arr.reduce(function(prev,next){ prev[next] = (prev[next] + 1) || 1; return prev; },{}); }
reduce(callback,initialValue)会传入两个参数,callback==》回调函数,initialValue==>初始值。当没有传入初始值时,prev是从数组中第一个元素开始的,next是数组的第二个元素;当传入初始值initalValue后,第一个将是initialValue,next是数组中的第一个元素。
6、数组去重
let arr = [1,2,3,4,4,1] let newArr = arr.reduce((pre,cur)=>{ if(!pre.includes(cur)){ return pre.concat(cur) }else{ return pre } },[]) console.log(newArr); // [1, 2, 3, 4]
7、累计函数的两个参数跟踪...
var arr = ["apple","orange"]; function noPassValue(){ return arr.reduce(function(prev,next){ console.log("prev:",prev); console.log("next:",next); return prev; }); } function passValue(){ return arr.reduce(function(prev,next){ console.log("prev:",prev); console.log("next:",next); prev[next] = 1; return prev; },{}); }
console.log("No Additional parameter:",noPassValue()); console.log("----------------"); console.log("With {} as an additional parameter:",passValue());
未完,待续......