JS-Reduce use method and principle analysis

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;

Published 35 original articles · won praise 1 · views 6718

Guess you like

Origin blog.csdn.net/qq_36162529/article/details/104371200