js数组reduce的相关用法

本文给大家整理了很多关于js数组方法reduce的经典代码片段,能够让大家更好的理解reduce的实例用法,一起学习下吧。

以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘。

javascript数组那么多方法,为什么我要单挑reduce方法,一个原因是我对这个方法掌握不够,不能够用到随心所欲。另一个方面,我也感觉到了这个方法的庞大魅力,在许多的场景中发挥着神奇的作用。

理解reduce函数

reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

  1. arr.reduce([callback, initialValue])

登录后复制

看如下例子:

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

登录后复制

片段一:字母游戏

  1. const anagrams = str => { if (str.length  {  return acc.concat(anagrams(str.slice(0, i) + str.slice(+ 1)).map(val => letter + val)); }, []);}anagrams("abc"); // 结果会是什么呢?

登录后复制

reduce负责筛选出每一次执行的首字母,递归负责对剩下字母的排列组合。

片段二:累加器

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

登录后复制

片段三:计数器

  1. 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,同时将加上之后的结果作为下次的初始值。

片段四:函数柯里化

函数柯里化的目的就是为了储存数据,然后在最后一步执行。

  1. const curry = (fn, arity = fn.length, ...args) =>  arity 

    通过判断函数的参数取得当前函数的length(当然也可以自己指定),如果所传的参数比当前参数少,则继续递归下面,同时储存上一次传递的参数。

    片段五:数组扁平化

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

  3. 片段六:生成菲波列契数组

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

  6. 片段七:管道加工器

  7. const pipe = (...funcs) => arg => funcs.reduce((acc, func) => func(acc), arg);pipe(btoa, x => x.toUpperCase())("Test");
  8. 登录后复制

  9. 通过对传递的参数进行函数加工,之后将加工之后的数据作为下一个函数的参数,这样层层传递下去。

  10. 片段八:中间件

  11. 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"));
  12. 登录后复制

  13. redux中经典的compose函数中运用了这种方式,通过对中间件的重重层叠,在真正发起action的时候触发函数执行。

  14. 片段九:redux-actionsstate的加工片段

  15. // 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);}
  16. 登录后复制

  17. 片段十:数据加工器

  18. 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);
  19. 登录后复制

  20. 片段十一:对象空值判断

  21. 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); // 张二蛋
  22. 登录后复制

  23. 片段十二:分组

  24. 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');
  25. 登录后复制

  26. 首先通过map计算出所有的键值,然后再根据建值进行归类

  27. 片段十三:对象过滤

  28. const pick = (obj, arr) =>arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
  29. 登录后复制

  30. 根据给出的键值来遍历,比较对象中是否存在相同键值的的值,然后通过逗号表达式把赋值后的对象赋给下一个的初始值

  31. 片段十四:数组中删除指定位置的值

  32. 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);
  33. 登录后复制

  34. 首先根据filter函数过滤出数组中符合条件的值,然后使用reduce在原数组中删除符合条件的值,可以得出最后arr的值变成了[1, 3]

  35. 片段十五:promise按照顺序执行

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

  38. 片段十六:排序

  39. 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 

    片段十七:选择

    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');
  40. 登录后复制

  41. 上面是我整理给大家的,希望今后会对大家有帮助。

  42. 相关文章:

  43. 详细解读Vue如何配置打包工具

  44. 详细解读Vue如何配置打包工具

  45. 详细解读Vue如何配置打包工具

  46. 详细解读Vue如何配置打包工具

  47. 详细解读Vue如何配置打包工具

  48. 以上就是js数组reduce的相关用法的详细内容,更多请关注【创想鸟】其它相关文章!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

点点赞赏,手留余香

给TA打赏
共0人
还没有人赞赏,快来当第一个赞赏的人吧!
    编程技术

    javascript中如何使用replace函数

    2025-3-31 22:01:45

    编程技术

    如何编写有质量的JS代码

    2025-3-31 22:01:52

    0 条回复 A文章作者 M管理员
    欢迎您,新朋友,感谢参与互动!
      暂无讨论,说说你的看法吧
    个人中心
    购物车
    优惠劵
    今日签到
    私信列表
    搜索