In this lesson we write an imperative function to flatten nested arrays, and then use the popular map, reduce, compose, and pipe functions to transform it into a high-level, point-free, functional implementation.
const array = [1, [2, 3], [[4, [5, [6], 7], [8, 9]]]];const concatReducer = (acc, curr) => acc.concat(curr);const map = f => ary => ary.map(f);const reduce = (f, init) => ary => ary.reduce(f, init);const compose = (f, g) => x => f(g(x));const flatten1Element = x => (Array.isArray(x) ? flatten(x) : x);const flattenEachElement = map(flatten1Element);const flattenOneLevel = reduce(concatReducer, []);const flatten = compose( flattenOneLevel, flattenEachElement);console.log(flatten(array));//[1,2,3,4,5,6,7,8,9]