- 通过arr[0]拿到end 简单的需求复杂的写法 探索函数组合
var testArr = ['start','middle','end'];
- 函数1:定义header 输入一个数组 返回数组的第一个元素
var header = arr => arr[0];
- 函数2: 定义reverse 输入一个数组 将数组中的元素倒转(顺便熟悉一下数组的归并方法reduce和reduceRight)
var reverse = function(arr){
return arr.reduceRight(function(prev,cur){
return prev.concat([cur])
},[])
}
或以下写法
var reverse = (arr)=>arr.reduceRight((prev,cur)=>prev.concat([cur]),[])
console.log(reverse(testArr)); // ["end", "middle", "start"]
- reduceRight第一个参数:
回调函数(在每一项上调用的函数)从右往左
参数1:前一个值 prev
参数2:当前值 cur
参数3:项的索引 index
参数4:数组对象 array - reduceRight第二个参数(可选)作为归并基础的初始值
这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数是数组的第二项。(所以只会执行arr.length-1次)。当然如果传第二个参数作为prev的初始值,那么就会执行arr.length次。 此例中传空数组[]作为第二个参数,是为了让prev一开始就是作为一个数组执行concat方法连接数组,不然第一个遍历的"end"调用concat方法会变成"endmiddle"
reduceRight的返回值就是遍历完整个数组并操作之后的最终值
- 函数3: compose函数是一个封装 返回值也是一个函数 这个新函数传的参将被return的这个匿名函数接受
- 所以这里需要用到reduce(跟reduceRight一样 只不过是从左往右) 函数的第二个参数 将这个需要处理的参数传进来作为初始值 交给...fns中的函数去处理
相当于把arr交给reverse函数处理 然后返回值再交给header函数处理
var compose = function(...fns){
return function(arr){
return fns.reduce(function(val,fn){
return fn(val)
},arr)
}
}
或以下写法
var compose = (...fns)=>(arr)=>fns.reduce((val,fn)=>fn(val),arr)
var last = compose(reverse,header)
console.log(last(testArr)); // 'end'