<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 22:22:01
        文檔

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

        js數組方法reduce經典用法代碼分享:以下是個人在工作中收藏總結的一些關于javascript數組方法reduce的相關代碼片段,后續遇到其他使用這個函數的場景,將會陸續添加,這里作為備忘。 javascript數組那么多方法,為什么我要單挑reduce方法,一個原因是我對這個方法掌握不夠,不能夠用到隨心所欲
        推薦度:
        導讀js數組方法reduce經典用法代碼分享:以下是個人在工作中收藏總結的一些關于javascript數組方法reduce的相關代碼片段,后續遇到其他使用這個函數的場景,將會陸續添加,這里作為備忘。 javascript數組那么多方法,為什么我要單挑reduce方法,一個原因是我對這個方法掌握不夠,不能夠用到隨心所欲

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

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

        理解reduce函數

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

        arr.reduce([callback, initialValue])

        看如下例子:

        let arr = [1, 2, 3, 4, 5];
        
        // 10代表初始值,p代表每一次的累加值,在第一次為10
        // 如果不存在初始值,那么p第一次值為1
        // 此時累加的
        結果為15 let 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.js
        const 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.js
        const reduceReducer = (...reducers) => {
         return (previous, current) => {
         reducers.reduce((p, r) => r(p, current), previous);
         }
        }
        // redux-actions/src/handleActions.js
        const 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');

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        js數組方法reduce經典用法代碼分享:以下是個人在工作中收藏總結的一些關于javascript數組方法reduce的相關代碼片段,后續遇到其他使用這個函數的場景,將會陸續添加,這里作為備忘。 javascript數組那么多方法,為什么我要單挑reduce方法,一個原因是我對這個方法掌握不夠,不能夠用到隨心所欲
        推薦度:
        標簽: 分享 方法 使用
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 老司机永久免费网站在线观看| 久久永久免费人妻精品| 成人黄页网站免费观看大全| 亚洲福利视频导航| 日韩内射激情视频在线播放免费| 亚洲av永久无码精品表情包| 丁香花在线视频观看免费| 亚洲欧洲日产国码av系列天堂 | 青青免费在线视频| 免费大香伊蕉在人线国产| 国产产在线精品亚洲AAVV| 国产大片51精品免费观看| 免费大片黄在线观看| 亚洲国产一成久久精品国产成人综合 | 亚洲中文字幕无码一去台湾| 成年轻人网站色免费看| 亚洲av无码一区二区三区天堂| 国产精品免费视频网站| 丰满妇女做a级毛片免费观看| 久久久亚洲精品蜜桃臀| 一级毛片在线免费看| 亚洲乱码卡三乱码新区| 可以免费观看的一级毛片| 中文无码日韩欧免费视频| 亚洲尹人香蕉网在线视颅| 国产一精品一AV一免费孕妇| www亚洲精品久久久乳| 国产aⅴ无码专区亚洲av麻豆| 久久99精品免费视频| 97se亚洲国产综合自在线| 国产乱子伦精品免费无码专区| 4hu四虎免费影院www| 亚洲视频国产精品| 国产精品久久香蕉免费播放| 中国一级特黄的片子免费| 91午夜精品亚洲一区二区三区| 日本xxwwxxww在线视频免费| 成全在线观看免费观看大全| 亚洲中文字幕无码一去台湾| 亚洲中文字幕无码久久2017| 日韩精品无码区免费专区|