亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JS的內建函數reduce

mrcode / 1402人閱讀

摘要:函數,是規(guī)范中出現(xiàn)的數組方法。所有的一切通過一個函數來管理流程和傳遞初始參數。上面就是函數的實現(xiàn),它需要對象作為參數,并返回一個類型的函數,作為的第一個參數。在該函數內部,則執(zhí)行多維的疊加工作。

@(js)

reduce函數,是ECMAScript5規(guī)范中出現(xiàn)的數組方法。在平時的工作中,相信大家使用的場景并不多,一般而言,可以通過reduce方法實現(xiàn)的邏輯都可以通過forEach方法來變相的實現(xiàn),雖然不清楚瀏覽器的js引擎是如何在C++層面實現(xiàn)這兩個方法,但是可以肯定的是reduce方法肯定也存在數組的遍歷,在具體實現(xiàn)細節(jié)上是否針對數組項的操作和存儲做了什么優(yōu)化,則不得而知。

[TOC]

數組的reduce方法的應用

reduce方法有兩個參數,第一個參數是一個callback,用于針對數組項的操作;第二個參數則是傳入的初始值,這個初始值用于單個數組項的操作。需要注意的是,reduce方法返回值并不是數組,而是形如初始值的經過疊加處理后的操作。

reduce方法最常見的場景就是疊加。

var items = [10, 120, 1000];

// our reducer function
var reducer = function add(sumSoFar, item) { return sumSoFar + item; };

// do the job
var total = items.reduce(reducer, 0);

console.log(total); // 1130

可以看出,reduce函數根據初始值0,不斷的進行疊加,完成最簡單的總和的實現(xiàn)。

前文中也提到,reduce函數的返回結果類型和傳入的初始值相同,上個實例中初始值為number類型,同理,初始值也可為object類型。

var items = [10, 120, 1000];

// our reducer function
var reducer = function add(sumSoFar, item) {
  sumSoFar.sum = sumSoFar.sum + item;
  return sumSoFar;
};

// do the job
var total = items.reduce(reducer, {sum: 0});

console.log(total); // {sum:1130}
多重疊加

使用reduce方法可以完成多維度的數據疊加。如上例中的初始值{sum: 0},這僅僅是一個維度的操作,如果涉及到了多個屬性的疊加,如{sum: 0,totalInEuros: 0,totalInYen: 0},則需要相應的邏輯進行處理。

在下面的方法中,采用分而治之的方法,即將reduce函數第一個參數callback封裝為一個數組,由數組中的每一個函數多帶帶進行疊加并完成reduce操作。所有的一切通過一個manager函數來管理流程和傳遞初始參數。

var manageReducers = function(reducers) {
  return function(state, item) {
    return Object.keys(reducers).reduce(
      function(nextState, key) {
        reducers[key](state, item);
        return state;
      },
      {}
    );
  }
};

上面就是manager函數的實現(xiàn),它需要reducers對象作為參數,并返回一個callback類型的函數,作為reduce的第一個參數。在該函數內部,則執(zhí)行多維的疊加工作(Object.keys())。

通過這種分治的思想,可以完成目標對象多個屬性的同時疊加,完整代碼如下:

var reducers = {  
  totalInEuros : function(state, item) {
    return state.euros += item.price * 0.897424392;
  },
  totalInYen : function(state, item) {
    return state.yens += item.price * 113.852;
  }
};

var manageReducers = function(reducers) {
  return function(state, item) {
    return Object.keys(reducers).reduce(
      function(nextState, key) {
        reducers[key](state, item);
        return state;
      },
      {}
    );
  }
};

var bigTotalPriceReducer = manageReducers(reducers);

var initialState = {euros:0, yens: 0};

var items = [{price: 10}, {price: 120}, {price: 1000}];

var totals = items.reduce(bigTotalPriceReducer, initialState);

console.log(totals);

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/78787.html

相關文章

  • [這段代碼很Pythonic]Python中內建函數(Built_in Funtions)

    摘要:前言在官方文檔的標準庫章節(jié)中,第一節(jié)是簡介,第二節(jié)就是,可見內建函數是標準庫的重要組成部分,而有很多內建函數我們平時卻很少用到或根本就不知道原來還有這么好用的函數居然直接就可以拿來用。接下來為大家介紹一些我認為被大家忽略掉的內建函數。 前言 在Python官方文檔的標準庫章節(jié)中,第一節(jié)是簡介,第二節(jié)就是Built_in Functions,可見內建函數是Python標準庫的重要組成部分...

    zgbgx 評論0 收藏0
  • Redux概念之四: reducer(歸納函數)與純函數

    摘要:函數的區(qū)分是以純函數與不純函數兩者來區(qū)分,但這不光只有無副作用的差異,還有其他的條件?,F(xiàn)在已經有一些新式的函數庫或框架例如,會特別強制要求在某些地方只能使用純函數,而具有副作用的不純函數只能在特定的情況下才能使用。 reducer(歸納函數) reducer(歸納函數)這種函數的名稱,是由數組的一個迭代方法reduce(歸納)而來,你可以參考MDN中的相關說明: 在JS語言中的數組re...

    wangjuntytl 評論0 收藏0
  • JS進階篇--JS數組reduce()方法詳解及高級技巧

    摘要:基本概念方法接收一個函數作為累加器,數組中的每個值從左到右開始縮減,最終為一個值。例進階應用使用方法可以完成多維度的數據疊加。在該函數內部,則執(zhí)行多維的疊加工作。參考的內建函數數組方法的高級技巧 基本概念 reduce() 方法接收一個函數作為累加器(accumulator),數組中的每個值(從左到右)開始縮減,最終為一個值。 reduce 為數組中的每一個元素依次執(zhí)行回調函數,不包括...

    jerryloveemily 評論0 收藏0
  • 看例子,學 Python(三)

    摘要:看例子,學三看例子,學一看例子,學二包創(chuàng)建一個目錄,把挪到里面,再添加一個空文件便是一個包。對來說,對象由引用計數管理,計數為時對象會自動銷毀。給定請問看例子,學一看例子,學二 看例子,學 Python(三) 看例子,學 Python(一)看例子,學 Python(二) 包 創(chuàng)建一個目錄 myutil,把 mymath.py 挪到里面,再添加一個空文件 __init__.py: myu...

    darkerXi 評論0 收藏0
  • 小李飛刀:python請你輕輕輕點虐

    摘要:迭代器可以直接作用于循環(huán)的對象統(tǒng)稱為可迭代對象??梢员缓瘮嫡{用并不斷返回下一個值的對象稱為迭代器。這個高階函數,關鍵在于正確實現(xiàn)一個篩選函數。 又是日常嘮嗑的一小段 真的是非常話嘮的在下,日常給自己打點雞血吧。昨晚和老媽聊了一整晚,所以昨天并沒有更新。然后因為很快要開始算個稅減免的部分,對于溫飽線的在下而言,其實減免的可能就只是奶茶錢吧。工作的本質是賺錢,我也很想在30歲之前完成財務自...

    Keagan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<