亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js數組方法reduce經典用法代碼分享

2019-11-19 14:34:41
字體:
來源:轉載
供稿:網友

以下是個人在工作中收藏總結的一些關于javascript數組方法reduce的相關代碼片段,后續遇到其他使用這個函數的場景,將會陸續添加,這里作為備忘。

javascript數組那么多方法,為什么我要單挑reduce方法,一個原因是我對這個方法掌握不夠,不能夠用到隨心所欲。另一個方面,我也感覺到了這個方法的龐大魅力,在許多的場景中發揮著神奇的作用。

理解reduce函數

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

arr.reduce([callback, initialValue])

看如下例子:

let arr = [1, 2, 3, 4, 5];// 10代表初始值,p代表每一次的累加值,在第一次為10// 如果不存在初始值,那么p第一次值為1// 此時累加的結果為15let sum = arr.reduce((p, c) => p + c, 10); // 25// 轉成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"); // 結果會是什么呢?

reduce負責篩選出每一次執行的首字母,遞歸負責對剩下字母的排列組合。

片段二:累加器

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

片段三:計數器

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

 

循環數組,每遇到一個值與給定值相等,即加1,同時將加上之后的結果作為下次的初始值。

片段四:函數柯里化

函數柯里化的目的就是為了儲存數據,然后在最后一步執行。

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);

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

片段五:數組扁平化

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

片段六:生成菲波列契數組

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");

通過對傳遞的參數進行函數加工,之后將加工之后的數據作為下一個函數的參數,這樣層層傳遞下去。

片段八:中間件

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中經典的compose函數中運用了這種方式,通過對中間件的重重層疊,在真正發起action的時候觸發函數執行。
片段九:redux-actions對state的加工片段
// redux-actions/src/handleAction.jsconst handleAction = (type, reducer, defaultState) => { const types = type.toString(); const [nextReducer, throwReducer] = [reducer, reducer]; return (state = defaultState, action) => {  const { type: actionType } = action;  if (!actionType || types.indexOf(actionType.toString()) === -1) {   return state;  }  return (action.error === true ? throwReducer : nextReducer)(state, action); }}// reduce-reducers/src/index.jsconst reduceReducer = (...reducers) => { return (previous, current) => {  reducers.reduce((p, r) => r(p, current), previous); }}// redux-actions/src/handleActions.jsconst handleActions = (handlers, defaultState, { namespace } = {}) => { // reducers的扁平化 const flattenedReducerMap = flattenReducerMap(handles, namespace); // 每一種ACTION下對應的reducer處理方式 const reducers = Reflect.ownkeys(flattenedReducerMap).map(type => handleAction(  type,  flattenedReducerMap[type],  defaultState )); // 狀態的加工器,用于對reducer的執行 const reducer = reduceReducers(...reducers); // reducer觸發 return (state = defaultState, action) => reducer(state, action);}
片段十:數據加工器
const reducers = { totalInEuros: (state, item) => {  return state.euros += item.price * 0.897424392; }, totalInYen: (state, item) => {  return state.yens += item.price * 113.852; }};const manageReducers = reducers => { return (state, item) => {  return Object.keys(reducers).reduce((nextState, key) => {   reducers[key](state, item);   return state;  }, {}) }}const bigTotalPriceReducer = manageReducers(reducers);const initialState = { euros: 0, yens: 0 };const items = [{ price: 10 }, { price: 120 }, { price: 1000 }];const totals = items.reduce(bigTotalPriceReducer, initialState);
片段十一:對象空值判斷
let school = { name: 'Hope middle school', created: '2001', classes: [  {   name: '三年二班',   teachers: [    { name: '張二蛋', age: 26, sex: '男', actor: '班主任' },    { name: '王小妞', age: 23, sex: '女', actor: '英語老師' }   ]  },  {   name: '明星班',   teachers: [    { name: '歐陽娜娜', age: 29, sex: '女', actor: '班主任' },    { name: '李易峰', age: 28, sex: '男', actor: '體育老師' },    { name: '楊冪', age: 111, sex: '女', actor: '藝術老師' }   ]  } ]};// 常規做法school.classes &&school.classes[0] &&school.classes[0].teachers &&school.classes[0].teachers[0] &&school.classes[0].teachers[0].name// reduce方法const get = (p, o) => p.reduce((xs, x) => (xs && xs[x] ? xs[x] : null), o);get(['classes', 0, 'teachers', 0, 'name'], school); // 張二蛋
片段十二:分組
const groupBy = (arr, func) =>arr.map(typeof func === 'function' ? func : val => val[func]).reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc;}, {});groupBy([6.1, 4.2, 6.3], Math.floor); groupBy(['one', 'two', 'three'], 'length'); 
首先通過map計算出所有的鍵值,然后再根據建值進行歸類
片段十三:對象過濾
const pick = (obj, arr) =>
arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});

pick({ a: 1, b: '2', c: 3 }, ['a', 'c']);

根據給出的鍵值來遍歷,比較對象中是否存在相同鍵值的的值,然后通過逗號表達式把賦值后的對象賦給下一個的初始值

片段十四:數組中刪除指定位置的值

const remove = (arr, func) => Array.isArray(arr) ? arr.filter(func).reduce((acc, val) => {   arr.splice(arr.indexOf(val), 1);   return acc.concat(val); }, []) : [];const arr = [1, 2, 3, 4];remove(arr, n => n % 2 == 0);

 

首先根據filter函數過濾出數組中符合條件的值,然后使用reduce在原數組中刪除符合條件的值,可以得出最后arr的值變成了[1, 3]

片段十五:promise按照順序執行

const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve());const delay = d => new Promise(r => setTimeout(r, d));const print = args => new Promise(r => r(args));runPromisesInSeries([() => delay(1000), () => delay(2000), () => print('hello')]);

片段十六:排序

const orderBy = (arr, props, orders) => [...arr].sort((a, b) =>  props.reduce((acc, prop, i) => {   if (acc === 0) {    const [p1, p2] = orders && orders[i] === 'desc' ? [b[prop], a[prop]] : [a[prop], b[prop]];    acc = p1 > p2 ? 1 : p1 < p2 ? -1 : 0;   }   return acc;  }, 0) );const users = [{ name: 'fred', age: 48 }, { name: 'barney', age: 36 }, { name: 'fly', age: 26 }];orderBy(users, ['name', 'age'], ['asc', 'desc']); orderBy(users, ['name', 'age']);

片段十七:選擇

const select = (from, selector) => selector.split('.').reduce((prev, cur) => prev && prev[cur], from);const obj = { selector: { to: { val: 'val to select' } } };select(obj, 'selector.to.val');

以上就是我們為大家整理的關于js數組方法reduce經典用法代碼內容,感謝你對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97成人精品视频在线观看| 国产精品7m视频| 另类视频在线观看| 国产精品久久久久久av| 日韩精品免费一线在线观看| 国产欧美一区二区三区视频| 亚洲欧洲激情在线| 日韩美女毛茸茸| 国产一区二区三区在线播放免费观看| 精品美女久久久久久免费| 国产suv精品一区二区三区88区| 欧美成人免费小视频| 亚洲精品电影网在线观看| 日韩在线小视频| 亚洲国产欧美一区二区三区同亚洲| 国产欧美一区二区| 91香蕉嫩草影院入口| 国产色综合天天综合网| 国产精品老女人视频| 日韩亚洲成人av在线| 91sa在线看| 高清日韩电视剧大全免费播放在线观看| 91亚洲精品视频| 成人a视频在线观看| 高清日韩电视剧大全免费播放在线观看| 亚洲精品电影在线| 欧美多人乱p欧美4p久久| 国产一区玩具在线观看| 久久免费精品日本久久中文字幕| 国产伦精品一区二区三区精品视频| 亚洲深夜福利在线| 91香蕉国产在线观看| 国产精品69精品一区二区三区| 中文字幕欧美精品日韩中文字幕| 久久成人精品电影| 欧美高清不卡在线| 亚洲精品91美女久久久久久久| 92裸体在线视频网站| 国产成人自拍视频在线观看| 中文字幕欧美视频在线| 日韩电影第一页| 国产亚洲精品久久久| 久久久久久久国产| 国产v综合v亚洲欧美久久| 日韩69视频在线观看| 亚洲国产成人爱av在线播放| 欧美亚洲午夜视频在线观看| 97在线看免费观看视频在线观看| 国产91在线视频| 日韩欧美在线视频免费观看| 久久久精品美女| 欧美激情三级免费| 国产乱人伦真实精品视频| 亚洲网站在线看| 久久亚洲私人国产精品va| 久久视频在线免费观看| 亚洲激情久久久| 在线看日韩欧美| 欧美激情视频在线观看| 亚洲人成网站777色婷婷| 国产精品视频网| 日韩激情视频在线播放| 欧美黑人狂野猛交老妇| 日本亚洲欧美三级| 亚洲自拍在线观看| 亚洲风情亚aⅴ在线发布| 国产欧美一区二区三区四区| 超碰精品一区二区三区乱码| 国产精品精品久久久久久| 91禁外国网站| 欧美黄色www| 欧美日韩不卡合集视频| 久久久久久久激情视频| 久久久免费高清电视剧观看| 欧美亚洲在线播放| 91最新国产视频| 亚洲成人国产精品| 97精品视频在线| 精品无码久久久久久国产| 亚洲欧美国产一区二区三区| 久久激情视频免费观看| 欧美大肥婆大肥bbbbb| 亚洲图片制服诱惑| 国产精品久久国产精品99gif| 久热99视频在线观看| 久久999免费视频| 久久久国产一区二区三区| 91av网站在线播放| 欧美精品国产精品日韩精品| 日韩在线观看免费网站| 红桃视频成人在线观看| 在线观看精品国产视频| 国产精品你懂得| 日韩亚洲精品电影| 国产精品jizz在线观看麻豆| 亚洲福利在线播放| 亚洲天堂av女优| 久久九九亚洲综合| 成人免费视频网| 国产成人精品一区二区| 国产精品9999| 中文在线资源观看视频网站免费不卡| 成人午夜在线视频一区| 欧美人与性动交a欧美精品| 亚洲激情在线视频| 日韩69视频在线观看| 日韩欧美福利视频| 亚洲综合成人婷婷小说| 亚洲黄页视频免费观看| 国产精品wwwwww| 欧美日韩在线视频一区| 欧美激情伊人电影| 亚洲国产精品成人va在线观看| 亚洲午夜精品久久久久久性色| 欧美日韩高清区| 欧美日韩日本国产| 国产激情视频一区| 美女啪啪无遮挡免费久久网站| 久久免费在线观看| 日韩中文av在线| 久久精品在线播放| 国产视频精品自拍| 最近2019中文免费高清视频观看www99| 91免费看国产| 狠狠操狠狠色综合网| 国产日韩欧美中文| 亚洲精品免费一区二区三区| 亚洲国产精彩中文乱码av在线播放| 欧美日韩在线看| 欧美多人乱p欧美4p久久| 国产成人精品日本亚洲专区61| 久久99热精品这里久久精品| 精品偷拍一区二区三区在线看| 精品成人69xx.xyz| 久久影院资源网| 国产精品福利小视频| 国产香蕉97碰碰久久人人| 国产精品69精品一区二区三区| 韩国v欧美v日本v亚洲| 国产成人jvid在线播放| 丝袜亚洲欧美日韩综合| 久久影院模特热| 国产狼人综合免费视频| 狠狠躁夜夜躁人人爽天天天天97| 91精品美女在线| 日韩欧美中文第一页| 国产精品专区第二| 国产最新精品视频| 日韩免费观看网站| 亚洲性生活视频在线观看| 91夜夜揉人人捏人人添红杏| 69国产精品成人在线播放| 欧美性资源免费| 狠狠躁18三区二区一区| 久久五月天综合| 久久99久久99精品中文字幕| 国产精品久久久久7777婷婷| 久久夜色精品亚洲噜噜国产mv| 欧美视频一二三| 欧美在线视频在线播放完整版免费观看| 国产精品免费久久久久久| 成人免费观看49www在线观看| 国产成人极品视频| 久久精品视频免费播放|