1. 程式人生 > 其它 >十一、高階函式:filter、map、reduce

十一、高階函式:filter、map、reduce

/**
 *程式設計正規化:指令式程式設計/宣告式程式設計
 *程式設計正規化:面向物件程式設計(第一公民:物件)/函數語言程式設計(第一公民:函式)
 **/
// const nums= [10,20,30,50,111,222,333,40,50];
// //1. 需求:取出所有小於100的數字
// let newNums = [];
// for(let n of nums){
//   if(n<100){
//    newNums.push(n);
//  }
// }
// //2. 將所有小於100的數字進行轉化:全部*2
// let new2Nums = [];
// for(let n of new2Nums){
//  if(n<100){
//     newNums.push(n*2);
//   }
// }
// console.log(new2Nums);
// //將所有的數字相加,得到最終結果
// let total = 0;
// for(let n of new2Nums){
//  total +=n;
// }
// console.log(total);



//高階函式:filter、map、reduce
/**
 * filter中的回撥函式有一個要求:必須返回一個boolean值
 *   true:當返回 true 時,函式內部會自動將這次回撥的 n 加入到新的陣列中
 *   false:當返回false時,函式內部會過濾掉這次的n
 * */
//結果:10 20 40 50 
const nums = [10,20,111,222,444,40,50];
let newNums = nums.filter(function(n){
    return n < 100
});
console.log(newNums);

/**
 * map函式的使用
 * */ 
//結果:20 40 80 100
let nuew2Nums = newNums.map(function(n){
  return n * 2;
});
console.log(nuew2Nums);

/**
 * reduce函式的使用
 * 作用:對陣列中的所有內容進行彙總
 * preValue引數:記錄上次返回的結果的值
 **/
// 第1次:preValue=0  n=20
// 第2次:preValue=20  n=40
// 第3次:preValue=60  n=80
// 第4次:preValue=140  n=100
// 結果:240
let totel = nuew2Nums.reduce(function(preValue, n){
  return preValue + n;
},0);
console.log(totel);

// 寫法二
let total = nums.filter(function(n){
  return n < 100;
}).map(function(n){
  return n * 2;
}).reduce(function(preValue, n){
  return preValue + n;
},0);
console.log(total);

// 寫法三
let total1 = nums.filter(n => n < 100)
                 .map(n => n * 2)
                 .reduce((pre,n)=> pre + n);
console.log(total1);