国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > JS > 正文

js數(shù)組方法reduce經(jīng)典用法代碼分享

2024-05-06 16:41:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

以下是個(gè)人在工作中收藏總結(jié)的一些關(guān)于javascript數(shù)組方法reduce的相關(guān)代碼片段,后續(xù)遇到其他使用這個(gè)函數(shù)的場(chǎng)景,將會(huì)陸續(xù)添加,這里作為備忘。

javascript數(shù)組那么多方法,為什么我要單挑reduce方法,一個(gè)原因是我對(duì)這個(gè)方法掌握不夠,不能夠用到隨心所欲。另一個(gè)方面,我也感覺(jué)到了這個(gè)方法的龐大魅力,在許多的場(chǎng)景中發(fā)揮著神奇的作用。

理解reduce函數(shù)

reduce() 方法接收一個(gè)函數(shù)作為累加器(accumulator),數(shù)組中的每個(gè)值(從左到右)開始縮減,最終為一個(gè)值。

arr.reduce([callback, initialValue])

看如下例子:

let arr = [1, 2, 3, 4, 5];// 10代表初始值,p代表每一次的累加值,在第一次為10// 如果不存在初始值,那么p第一次值為1// 此時(shí)累加的結(jié)果為15let sum = arr.reduce((p, c) => p + c, 10); // 25// 轉(zhuǎn)成es5的寫法即為:var sum = arr.reduce(function(p, c) { console.log(p); return p + c;}, 10);

片段一:字母游戲

const anagrams = str => { if (str.length <= 2) {  return str.length === 2 ? [str, str[1] + str[0]] : str; } return str.split("").reduce((acc, letter, i) => {  return acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)); }, []);}anagrams("abc"); // 結(jié)果會(huì)是什么呢?

reduce負(fù)責(zé)篩選出每一次執(zhí)行的首字母,遞歸負(fù)責(zé)對(duì)剩下字母的排列組合。

片段二:累加器

const sum = arr => arr.reduce((acc, val) => acc + val, 0);sum([1, 2, 3]);

片段三:計(jì)數(shù)器

const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);countOccurrences([1, 2, 3, 2, 2, 5, 1], 1);

 

循環(huán)數(shù)組,每遇到一個(gè)值與給定值相等,即加1,同時(shí)將加上之后的結(jié)果作為下次的初始值。

片段四:函數(shù)柯里化

函數(shù)柯里化的目的就是為了儲(chǔ)存數(shù)據(jù),然后在最后一步執(zhí)行。

const curry = (fn, arity = fn.length, ...args) =>  arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args);curry(Math.pow)(2)(10);curry(Math.min, 3)(10)(50)(2);

通過(guò)判斷函數(shù)的參數(shù)取得當(dāng)前函數(shù)的length(當(dāng)然也可以自己指定),如果所傳的參數(shù)比當(dāng)前參數(shù)少,則繼續(xù)遞歸下面,同時(shí)儲(chǔ)存上一次傳遞的參數(shù)。

片段五:數(shù)組扁平化

const deepFlatten = arr =>  arr.reduce((a, v) => a.concat(Array.isArray(v) ? deepFlatten(v) : v), []);deepFlatten([1, [2, [3, 4, [5, 6]]]]);

片段六:生成菲波列契數(shù)組

const fibonacci = n => Array(n).fill(0).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);fibonacci(5);

片段七:管道加工器

const pipe = (...funcs) => arg => funcs.reduce((acc, func) => func(acc), arg);pipe(btoa, x => x.toUpperCase())("Test");

通過(guò)對(duì)傳遞的參數(shù)進(jìn)行函數(shù)加工,之后將加工之后的數(shù)據(jù)作為下一個(gè)函數(shù)的參數(shù),這樣層層傳遞下去。

片段八:中間件

const dispatch = action => { console.log('action', action); return action;}const middleware1 = dispatch => { return action => {  console.log("middleware1");  const result = dispatch(action);  console.log("after middleware1");  return result; }}const middleware2 = dispatch => { return action => {  console.log("middleware2");  const result = dispatch(action);  console.log("after middleware2");  return result; }}const middleware3 = dispatch => { return action => {  console.log("middleware3");  const result = dispatch(action);  console.log("after middleware3");  return result; }}const compose = middlewares => middlewares.reduce((a, b) => args => a(b(args)))const middlewares = [middleware1, middleware2, middleware3];const afterDispatch = compose(middlewares)(dispatch);const testAction = arg => { return { type: "TEST_ACTION", params: arg };};afterDispatch(testAction("1111"));

 

redux中經(jīng)典的compose函數(shù)中運(yùn)用了這種方式,通過(guò)對(duì)中間件的重重層疊,在真正發(fā)起action的時(shí)候觸發(fā)函數(shù)執(zhí)行。
片段九:redux-actions對(duì)state的加工片段
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 西乌| 嘉善县| 赞皇县| 十堰市| 盐津县| 德保县| 邢台市| 海晏县| 大丰市| 临邑县| 富裕县| 新源县| 古丈县| 集安市| 蒲江县| 两当县| 云梦县| 泸溪县| 马边| 武夷山市| 周口市| 顺义区| 聂荣县| 台州市| 汶川县| 老河口市| 马山县| 汤原县| 武隆县| 恭城| 陵川县| 方正县| 平原县| 淮安市| 建宁县| 永顺县| 阜平县| 平阴县| 阿坝县| 清涧县| 北辰区|