高階函數(shù)之map filter reduce

記錄一下最近看的高階函數(shù)~

參考鏈接
https://juejin.im/post/5cb30e2ce51d456e63760450#heading-9
https://www.cnblogs.com/chengxs/p/11088238.html

高階函數(shù)

高階函數(shù)指的是一個函數(shù)以函數(shù)為參數(shù),或以函數(shù)為返回值莱睁,或者既以函數(shù)為參數(shù)又以函數(shù)為返回值

高階函數(shù)經常用于:

  • 抽象或隔離行為崎脉、作用阀蒂,異步控制流程作為回調函數(shù)何鸡,promises肾扰,monads等
  • 創(chuàng)建可以泛用于各種數(shù)據(jù)類型的功能
  • 部分應用于函數(shù)參數(shù)(偏函數(shù)應用)或創(chuàng)建一個柯里化的函數(shù)抄伍,用于復用或函數(shù)復合熏挎。
  • 接受一個函數(shù)列表并返回一些由這個列表中的函數(shù)組成的復合函數(shù)

js一些內置的高階函數(shù)

Array.prototype.map
Array.prototype.filter
Array.prototype.reduce

一張圖講清三者區(qū)別

區(qū)別

map

map() 方法創(chuàng)建一個新數(shù)組,其結果是該數(shù)組中的每個元素都調用一個提供的函數(shù)后返回的結果前痘。map 不會改變原數(shù)組凛捏。

var animals = [
  { name: "Fluffykins", species: "rabbit" },
  { name: "Caro", species: "dog" },
  { name: "Hamilton", species: "dog" },
  { name: "Harold", species: "fish" },
  { name: "Ursula", species: "cat" },
  { name: "Jimmy", species: "fish" }
];

// 不使用高階函數(shù)
var names = [];
for (let i = 0; i < animals.length; i++) {
  names.push(animals[i].name);
}
console.log(names); //["Fluffykins", "Caro", "Hamilton", "Harold", "Ursula", "Jimmy"]


// 使用高階函數(shù)
var names = animals.map(x=>x.name);
console.log(names); //["Fluffykins", "Caro", "Hamilton", "Harold", "Ursula", "Jimmy"]

filter

filter() 方法會創(chuàng)建一個新數(shù)組,其中包含所有通過回調函數(shù)測試的元素芹缔。
filter 為數(shù)組中的每個元素調用一次 callback 函數(shù)坯癣, callback 函數(shù)返回 true 表示該元素通過測試,保留該元素最欠,false 則不保留示罗。filter 不會改變原數(shù)組惩猫,它返回過濾后的新數(shù)組。

var animals = [
  { name: "Fluffykins", species: "rabbit" },
  { name: "Caro", species: "dog" },
  { name: "Hamilton", species: "dog" },
  { name: "Harold", species: "fish" },
  { name: "Ursula", species: "cat" },
  { name: "Jimmy", species: "fish" }
];

// 不使用高階函數(shù)
var dogs = [];
for (var i = 0; i < animals.length; i++) {
  if (animals[i].species === "dog") dogs.push(animals[i]);
}
console.log(dogs); 


// 使用高階函數(shù)
var dogs = animals.filter(x => x.species === "dog");
console.log(dogs); // {name: "Caro", species: "dog"} // { name: "Hamilton", species: "dog" }


reduce

reduce 方法對調用數(shù)組的每個元素執(zhí)行回調函數(shù)蚜点,最后生成一個單一的值并返回轧房。 reduce 方法接受兩個參數(shù):1)reducer 函數(shù)(回調),2)一個可選的 initialValue绍绘。
reduce() 方法接收一個函數(shù)作為累加器奶镶,數(shù)組中的每個值(從左到右)開始縮減,最終計算為一個值陪拘。

語法

arr.reduce(callback,initialValue)

reduce的一些應用場景

1.求和求積

var arr = [1, 2, 3, 4];
var sum = arr.reduce((x,y)=>x+y)
var mul = arr.reduce((x,y)=>x*y)
console.log( sum ); //求和厂镇,10
console.log( mul ); //求乘積,24

2.計算數(shù)組中每個元素出現(xiàn)的次數(shù)

let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

let nameNum = names.reduce((pre,cur)=>{
  if(cur in pre){
    pre[cur]++
  }else{
    pre[cur] = 1 
  }
  return pre
},{})
console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}

3.數(shù)組去重

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]

4.將二維數(shù)組轉化為一維

let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]

5.將多維數(shù)組轉化為一維

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]

6.對象里的屬性求和

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

7.將[1,3,1,4]轉為數(shù)字1314

function addDigitValue(prev,curr,curIndex,array){
    var exponent = (array.length -1) -curIndex;
    var digitValue = curr*Math.pow(10,exponent);
    return prev + digitValue;
}
var arr6 = [1,3,1,4];
var result7 = arr6.reduce(addDigitValue,0)
console.info('result7',result7)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末左刽,一起剝皮案震驚了整個濱河市捺信,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欠痴,老刑警劉巖残黑,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斋否,居然都是意外死亡梨水,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門茵臭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疫诽,“玉大人,你說我怎么就攤上這事旦委∑嫱剑” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵缨硝,是天一觀的道長摩钙。 經常有香客問我,道長查辩,這世上最難降的妖魔是什么胖笛? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮宜岛,結果婚禮上长踊,老公的妹妹穿的比我還像新娘。我一直安慰自己萍倡,他們只是感情好身弊,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般阱佛。 火紅的嫁衣襯著肌膚如雪帖汞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天凑术,我揣著相機與錄音涨冀,去河邊找鬼。 笑死麦萤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的扁眯。 我是一名探鬼主播壮莹,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姻檀!你這毒婦竟也來了命满?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤绣版,失蹤者是張志新(化名)和其女友劉穎胶台,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杂抽,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡诈唬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缩麸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铸磅。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杭朱,靈堂內的尸體忽然破棺而出阅仔,到底是詐尸還是另有隱情,我是刑警寧澤弧械,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布八酒,位于F島的核電站,受9級特大地震影響刃唐,放射性物質發(fā)生泄漏羞迷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一画饥、第九天 我趴在偏房一處隱蔽的房頂上張望闭树。 院中可真熱鬧,春花似錦荒澡、人聲如沸报辱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碍现。三九已至幅疼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昼接,已是汗流浹背爽篷。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慢睡,地道東北人逐工。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像漂辐,于是被迫代替她去往敵國和親泪喊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348