以下是个人在工作中收藏总结的一些关于javascript数组方法reduce
的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘。
javascript数组那么多方法,为什么我要单挑reduce
方法,一个原因是我对这个方法掌握不够,不能够用到随心所欲。另一个方面,我也感觉到了这个方法的庞大魅力,在许多的场景中发挥着神奇的作用。
理解reduce
函数
reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。
rush:xhtml;">
arr.reduce([callback,initialValue])
看如下例子:
// 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);
片段一:字母游戏
{
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
负责筛选出每一次执行的首字母,递归负责对剩下字母的排列组合。
片段二:累加器
arr.reduce((acc,val) => acc + val,0);
sum([1,3]);
片段三:计数器
arr.reduce((a,v) => v === value ? a + 1 : a + 0,0);
countOccurrences([1,5,1],1);
循环数组,每遇到一个值与给定值相等,即加1,同时将加上之后的结果作为下次的初始值。
函数柯里化的目的就是为了储存数据,然后在最后一步执行。
arity <= args.length ? fn(...args) : curry.bind(null,fn,arity,...args);
curry(Math.pow)(2)(10);
curry(Math.min,3)(10)(50)(2);
通过判断函数的参数取得当前函数的length
(当然也可以自己指定),如果所传的参数比当前参数少,则继续递归下面,同时储存上一次传递的参数。
片段五:数组扁平化
arr.reduce((a,v) => a.concat(Array.isArray(v) ? deepFlatten(v) : v),[]);
deepFlatten([1,[2,[3,[5,6]]]]);
片段六:生成菲波列契数组
Array(n).fill(0).reduce((acc,val,i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i),[]);
fibonacci(5);
片段七:管道加工器
arg => funcs.reduce((acc,func) => func(acc),arg);
pipe(btoa,x => x.
toupperCase())("Test");
通过对传递的参数进行函数加工,之后将加工之后的数据作为下一个函数的参数,这样层层传递下去。
片段八:中间件
{
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"));
<div class="sourceCode">redux
中经典的compose
函数中运用了这种方式,通过对中间件的重重层叠,在真正发起action的时候触发函数执行。