JavaScript 中 map、foreach、reduce 間的區別



一直對map、foreach、reduce這些函數非常生疏,今天看underscorejs時好好研究了一下,一研究我就更懵了,這不是同樣嘛,都是遍歷,因此我就去知乎找了一下,整理出了比較好的幾個說法。
假設咱們有一個數組,每一個元素是一我的。你面前站了一排人。
foreach 就是你按順序一個一個跟他們作點什麼,具體作什麼,隨便:
people.forEach(function (dude) {
  dude.pickUpSoap();});
map 就是你手裏拿一個盒子(一個新的數組),一個一個叫他們把錢包扔進去。結束的時候你得到了一個新的數組,裏面是你們的錢包,錢包的順序和人的順序一一對應。
var wallets = people.map(function (dude) {
  return dude.wallet;});
reduce 就是你拿着錢包,一個一個數過去看裏面有多少錢啊?每檢查一個,你就和前面的總和加一塊兒來。這樣結束的時候你就知道你們總共有多少錢了。
var totalMoney = wallets.reduce(function (countedMoney, wallet) {
  return countedMoney + wallet.money;}, 0);

補充一個 filter 的:
你一個個錢包數過去的時候,裏面錢少於 100 塊的不要(留在原來的盒子裏),多於 100 塊的丟到一個新的盒子裏。這樣結束的時候你又有了一個新的數組,裏面是全部錢多於 100 塊的錢包:
var fatWallets = wallets.filter(function (wallet) {
  return wallet.money > 100;});

最後要說明一點這個類比和實際代碼的一個區別,那就是 map 和 filter 都是 immutable methods,也就是說它們只會返回一個新數組,而不會改變原來的那個數組,因此這裏 filter 的例子是和代碼有些出入的(原來的盒子裏的錢包減小了),但爲了形象說明,你們理解就好。

Array.prototype.map = function (fn) {
    var resultArray = [];
    for (var i = 0,len = this.length; i < len ; i++) {
         resultArray[i] = fn.apply(this,[this[i],i,this]);
    }
    return resultArray;}

Array.prototype.forEach = function (fn) {
    for (var i = 0,len = this.length; i < len ; i++) {
         fn.apply(this,[this[i],i,this]);
    }}

Array.prototype.reduce= function (fn) {
    var formerResult = this[0];
    for (var i = 1,len = this.length; i < len ; i++) {
         formerResult = fn.apply(this,[formerResult,this[i],i,this]);
    }
    return formerResult;}
相關文章
相關標籤/搜索