摘要:函數(shù),是規(guī)范中出現(xiàn)的數(shù)組方法。所有的一切通過一個函數(shù)來管理流程和傳遞初始參數(shù)。上面就是函數(shù)的實現(xiàn),它需要對象作為參數(shù),并返回一個類型的函數(shù),作為的第一個參數(shù)。在該函數(shù)內(nèi)部,則執(zhí)行多維的疊加工作。
@(js)
reduce函數(shù),是ECMAScript5規(guī)范中出現(xiàn)的數(shù)組方法。在平時的工作中,相信大家使用的場景并不多,一般而言,可以通過reduce方法實現(xiàn)的邏輯都可以通過forEach方法來變相的實現(xiàn),雖然不清楚瀏覽器的js引擎是如何在C++層面實現(xiàn)這兩個方法,但是可以肯定的是reduce方法肯定也存在數(shù)組的遍歷,在具體實現(xiàn)細節(jié)上是否針對數(shù)組項的操作和存儲做了什么優(yōu)化,則不得而知。
[TOC]
數(shù)組的reduce方法的應(yīng)用reduce方法有兩個參數(shù),第一個參數(shù)是一個callback,用于針對數(shù)組項的操作;第二個參數(shù)則是傳入的初始值,這個初始值用于單個數(shù)組項的操作。需要注意的是,reduce方法返回值并不是數(shù)組,而是形如初始值的經(jīng)過疊加處理后的操作。
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函數(shù)根據(jù)初始值0,不斷的進行疊加,完成最簡單的總和的實現(xiàn)。
前文中也提到,reduce函數(shù)的返回結(jié)果類型和傳入的初始值相同,上個實例中初始值為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方法可以完成多維度的數(shù)據(jù)疊加。如上例中的初始值{sum: 0},這僅僅是一個維度的操作,如果涉及到了多個屬性的疊加,如{sum: 0,totalInEuros: 0,totalInYen: 0},則需要相應(yīng)的邏輯進行處理。
在下面的方法中,采用分而治之的方法,即將reduce函數(shù)第一個參數(shù)callback封裝為一個數(shù)組,由數(shù)組中的每一個函數(shù)多帶帶進行疊加并完成reduce操作。所有的一切通過一個manager函數(shù)來管理流程和傳遞初始參數(shù)。
var manageReducers = function(reducers) { return function(state, item) { return Object.keys(reducers).reduce( function(nextState, key) { reducers[key](state, item); return state; }, {} ); } };
上面就是manager函數(shù)的實現(xiàn),它需要reducers對象作為參數(shù),并返回一個callback類型的函數(shù),作為reduce的第一個參數(shù)。在該函數(shù)內(nèi)部,則執(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);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/78787.html
摘要:前言在官方文檔的標準庫章節(jié)中,第一節(jié)是簡介,第二節(jié)就是,可見內(nèi)建函數(shù)是標準庫的重要組成部分,而有很多內(nèi)建函數(shù)我們平時卻很少用到或根本就不知道原來還有這么好用的函數(shù)居然直接就可以拿來用。接下來為大家介紹一些我認為被大家忽略掉的內(nèi)建函數(shù)。 前言 在Python官方文檔的標準庫章節(jié)中,第一節(jié)是簡介,第二節(jié)就是Built_in Functions,可見內(nèi)建函數(shù)是Python標準庫的重要組成部分...
摘要:函數(shù)的區(qū)分是以純函數(shù)與不純函數(shù)兩者來區(qū)分,但這不光只有無副作用的差異,還有其他的條件。現(xiàn)在已經(jīng)有一些新式的函數(shù)庫或框架例如,會特別強制要求在某些地方只能使用純函數(shù),而具有副作用的不純函數(shù)只能在特定的情況下才能使用。 reducer(歸納函數(shù)) reducer(歸納函數(shù))這種函數(shù)的名稱,是由數(shù)組的一個迭代方法reduce(歸納)而來,你可以參考MDN中的相關(guān)說明: 在JS語言中的數(shù)組re...
摘要:基本概念方法接收一個函數(shù)作為累加器,數(shù)組中的每個值從左到右開始縮減,最終為一個值。例進階應(yīng)用使用方法可以完成多維度的數(shù)據(jù)疊加。在該函數(shù)內(nèi)部,則執(zhí)行多維的疊加工作。參考的內(nèi)建函數(shù)數(shù)組方法的高級技巧 基本概念 reduce() 方法接收一個函數(shù)作為累加器(accumulator),數(shù)組中的每個值(從左到右)開始縮減,最終為一個值。 reduce 為數(shù)組中的每一個元素依次執(zhí)行回調(diào)函數(shù),不包括...
摘要:看例子,學(xué)三看例子,學(xué)一看例子,學(xué)二包創(chuàng)建一個目錄,把挪到里面,再添加一個空文件便是一個包。對來說,對象由引用計數(shù)管理,計數(shù)為時對象會自動銷毀。給定請問看例子,學(xué)一看例子,學(xué)二 看例子,學(xué) Python(三) 看例子,學(xué) Python(一)看例子,學(xué) Python(二) 包 創(chuàng)建一個目錄 myutil,把 mymath.py 挪到里面,再添加一個空文件 __init__.py: myu...
摘要:迭代器可以直接作用于循環(huán)的對象統(tǒng)稱為可迭代對象。可以被函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器。這個高階函數(shù),關(guān)鍵在于正確實現(xiàn)一個篩選函數(shù)。 又是日常嘮嗑的一小段 真的是非常話嘮的在下,日常給自己打點雞血吧。昨晚和老媽聊了一整晚,所以昨天并沒有更新。然后因為很快要開始算個稅減免的部分,對于溫飽線的在下而言,其實減免的可能就只是奶茶錢吧。工作的本質(zhì)是賺錢,我也很想在30歲之前完成財務(wù)自...
閱讀 869·2021-11-22 09:34
閱讀 1002·2021-10-08 10:16
閱讀 1816·2021-07-25 21:42
閱讀 1790·2019-08-30 15:53
閱讀 3518·2019-08-30 13:08
閱讀 2174·2019-08-29 17:30
閱讀 3341·2019-08-29 17:22
閱讀 2173·2019-08-29 15:35