- 通過arr[0]拿到end 簡單的需求復(fù)雜的寫法 探索函數(shù)組合
var testArr = ['start','middle','end'];
- 函數(shù)1:定義header 輸入一個數(shù)組 返回?cái)?shù)組的第一個元素
var header = arr => arr[0];
- 函數(shù)2: 定義reverse 輸入一個數(shù)組 將數(shù)組中的元素倒轉(zhuǎn)(順便熟悉一下數(shù)組的歸并方法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第一個參數(shù):
回調(diào)函數(shù)(在每一項(xiàng)上調(diào)用的函數(shù))從右往左
參數(shù)1:前一個值 prev
參數(shù)2:當(dāng)前值 cur
參數(shù)3:項(xiàng)的索引 index
參數(shù)4:數(shù)組對象 array - reduceRight第二個參數(shù)(可選)作為歸并基礎(chǔ)的初始值
這個函數(shù)返回的任何值都會作為第一個參數(shù)自動傳給下一項(xiàng)。第一次迭代發(fā)生在數(shù)組的第二項(xiàng)上帚屉,因此第一個參數(shù)是數(shù)組的第一項(xiàng)苹支,第二個參數(shù)是數(shù)組的第二項(xiàng)酬滤。(所以只會執(zhí)行arr.length-1次)。當(dāng)然如果傳第二個參數(shù)作為prev的初始值异剥,那么就會執(zhí)行arr.length次。 此例中傳空數(shù)組[]作為第二個參數(shù),是為了讓prev一開始就是作為一個數(shù)組執(zhí)行concat方法連接數(shù)組逼庞,不然第一個遍歷的"end"調(diào)用concat方法會變成"endmiddle"
reduceRight的返回值就是遍歷完整個數(shù)組并操作之后的最終值
- 函數(shù)3: compose函數(shù)是一個封裝 返回值也是一個函數(shù) 這個新函數(shù)傳的參將被return的這個匿名函數(shù)接受
- 所以這里需要用到reduce(跟reduceRight一樣 只不過是從左往右) 函數(shù)的第二個參數(shù) 將這個需要處理的參數(shù)傳進(jìn)來作為初始值 交給...fns中的函數(shù)去處理
相當(dāng)于把a(bǔ)rr交給reverse函數(shù)處理 然后返回值再交給header函數(shù)處理
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'