1. How to use:
var arr = [1, 2, 3, 4, 5]
var result = arr.reduce(function(prev, curr) {
return prev + curr
});
// result = 15
Second, the realization principle:
Array.prototype.myReduce = function(fn, initialValue) {
if (this.length === 0) {
if (initialValue === undefined) {
console.error("reduce of empty array with no initialValue")
} else {
return initialValue
}
} else {
var prev = initialValue !== undefined ? initialValue : this[0]
var startIndex = initialValue !== undefined ? 0 : 1
for (var i = startIndex; i < this.length; i++) {
prev = fn(prev, this[i])
}
return prev
}
}
Three, use analysis:
function f1() {
console.log("f1");
}
function f2() {
console.log("f2");
}
function f3() {
console.log("f3");
}
compose(f1,f2,f3)(); // f1,f2,f3
function compose(...funcs) {
const len = funcs.length;
if (len === 0) {
return arg => arg;
}
if (len === 1) {
return funcs[0];
}
return funcs.reduce((left, right) => {
return (...args) => right(left(...args))
});
}
return funcs.reduce((left, right) => {
return (...args) => right(left(...args)) // newF
});
// Analyze this paragraph
prev = funcs[0]; // left->f1
for (var i = 1; i <len; i ++) {
prev = fn (prev, funcs [i]) // prev = fn (f1, f2) = (... args) => f2 (f1 (... args)); sumFn first loop
// prev = fn (sumFn, f3) = (... args) => f3 (sumFn (... args)) second loop
// funcs.reduce = (... args) => f3 (sumFn (... args)); return value
}
return prev;