欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年01月07日 09:32:44   作者:糊一笑  
本文給大家整理了很多關(guān)于js數(shù)組方法reduce的經(jīng)典代碼片段,能夠讓大家更好的理解reduce的實(shí)例用法,一起學(xué)習(xí)下吧。

以下是個(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è)值(從左到右)開(kāi)始縮減,最終為一個(gè)值。

arr.reduce([callback, initialValue])

看如下例子:

let arr = [1, 2, 3, 4, 5];

// 10代表初始值,p代表每一次的累加值,在第一次為10
// 如果不存在初始值,那么p第一次值為1
// 此時(shí)累加的結(jié)果為15
let 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的加工片段
// 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下對(duì)應(yīng)的reducer處理方式
 const reducers = Reflect.ownkeys(flattenedReducerMap).map(type => handleAction(
  type,
  flattenedReducerMap[type],
  defaultState
 ));
 // 狀態(tài)的加工器,用于對(duì)reducer的執(zhí)行
 const reducer = reduceReducers(...reducers);
 // reducer觸發(fā)
 return (state = defaultState, action) => reducer(state, action);
}
片段十:數(shù)據(jù)加工器
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);
片段十一:對(duì)象空值判斷
let school = {
 name: 'Hope middle school',
 created: '2001',
 classes: [
  {
   name: '三年二班',
   teachers: [
    { name: '張二蛋', age: 26, sex: '男', actor: '班主任' },
    { name: '王小妞', age: 23, sex: '女', actor: '英語(yǔ)老師' }
   ]
  },
  {
   name: '明星班',
   teachers: [
    { name: '歐陽(yáng)娜娜', age: 29, sex: '女', actor: '班主任' },
    { name: '李易峰', age: 28, sex: '男', actor: '體育老師' },
    { name: '楊冪', age: 111, sex: '女', actor: '藝術(shù)老師' }
   ]
  }
 ]
};
// 常規(guī)做法
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'); 
首先通過(guò)map計(jì)算出所有的鍵值,然后再根據(jù)建值進(jìn)行歸類
片段十三:對(duì)象過(guò)濾
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']);

根據(jù)給出的鍵值來(lái)遍歷,比較對(duì)象中是否存在相同鍵值的的值,然后通過(guò)逗號(hào)表達(dá)式把賦值后的對(duì)象賦給下一個(gè)的初始值

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

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

 

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

片段十五:promise按照順序執(zhí)行

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

以上就是我們?yōu)榇蠹艺淼年P(guān)于js數(shù)組方法reduce經(jīng)典用法代碼內(nèi)容,感謝你對(duì)腳本之家的支持。

相關(guān)文章

  • 屏蔽IE彈出"您查看的網(wǎng)頁(yè)正在試圖關(guān)閉窗口,是否關(guān)閉此窗口"的方法

    屏蔽IE彈出"您查看的網(wǎng)頁(yè)正在試圖關(guān)閉窗口,是否關(guān)閉此窗口"的方法

    本篇文章主要是對(duì)屏蔽IE彈出"您查看的網(wǎng)頁(yè)正在試圖關(guān)閉窗口,是否關(guān)閉此窗口"的方法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • javascript 面向?qū)ο骹unction詳解及實(shí)例代碼

    javascript 面向?qū)ο骹unction詳解及實(shí)例代碼

    這篇文章主要介紹了javascript 面向?qū)ο骹unction詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建(2)

    JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建(2)

    這篇文章主要介紹了JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建,上一篇我們介紹了什么是集合,并且手動(dòng)實(shí)現(xiàn)了一個(gè)集合的類,本篇基于上篇內(nèi)容繼續(xù)深入介紹需要的小伙伴可以參考一下
    2022-04-04
  • JavaScript中的finally()方法和Filter()方法詳解

    JavaScript中的finally()方法和Filter()方法詳解

    finally是 JavaScript 構(gòu)造中使用的方法try-catch,Filter() 是 JavaScript 中的一種方法,可以通過(guò)處理數(shù)組輕松提供過(guò)濾后的輸出數(shù)據(jù),本文就給大家詳細(xì)的介紹一下JavaScript中的finally()方法和Filter()方法,需要的朋友可以參考下
    2023-08-08
  • 淺析js中事件冒泡與事件捕獲

    淺析js中事件冒泡與事件捕獲

    js中事件冒泡、事件捕獲一直都是困擾大家的問(wèn)題,本文利用大量代碼解釋了js中事件冒泡與事件捕獲,希望對(duì)小伙伴們有所幫助
    2021-08-08
  • 前端碎片localStorage的清除方法

    前端碎片localStorage的清除方法

    這篇文章主要介紹了前端localStorage清除方法的相關(guān)資料,localStorage是前端存儲(chǔ)數(shù)據(jù)的工具,數(shù)據(jù)不會(huì)因?yàn)轫?yè)面刷新而消失,但測(cè)試后需要清除數(shù)據(jù),清除localStorage的方法包括手動(dòng)清除、編程方式清除、使用瀏覽器提供的清除功能和使用第三方庫(kù),需要的朋友可以參考下
    2024-11-11
  • javascript eval(func())使用示例

    javascript eval(func())使用示例

    eval的作用其實(shí)很簡(jiǎn)單,就是把一段字符串傳遞給JS解釋器,由Javascript解釋器將這段字符串解釋成Javascript代碼,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下
    2013-12-12
  • JavaScript 數(shù)組循環(huán)引起的思考

    JavaScript 數(shù)組循環(huán)引起的思考

    Google array.js 程序中建議改進(jìn)的代碼。思考為什么i-- 到了 i為0時(shí)while循環(huán)結(jié)束了?
    2010-01-01
  • JS實(shí)現(xiàn)導(dǎo)航欄樓層特效

    JS實(shí)現(xiàn)導(dǎo)航欄樓層特效

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)導(dǎo)航欄樓層特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • TypeScript使用函數(shù)重載確定返回類型的實(shí)現(xiàn)方法

    TypeScript使用函數(shù)重載確定返回類型的實(shí)現(xiàn)方法

    這篇文章主要介紹了TypeScript使用函數(shù)重載確定返回類型的實(shí)現(xiàn)方法,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03

最新評(píng)論