종래의 사용법은 아래와 같고
[1,5,3].reduce((pre,cur)=>pre+cur,0) // 9=(((0+1)+5)+3)
구현물은 아래와 같다
const nums = [1, 3, 5, 7, 9];
const reduce = (f, initial, iter) => {
if(!iter){
iter = initial[Symbol.iterator]();
initial = iter.next().value;
}
for (const a of iter) {
initial = f(initial, a);
}
return initial;
};
const add = (a, b) => a + b;
console.log("qq", reduce(add, 0, nums));
굳이 이 함수를 구현한 이유는 아래와 같은 함수를 구현하기 위해서이다.
const go = (...args) => {
console.log(args)
reduce((a,f)=>f(a),args)
}
go(0,a=>a+1,a=>a+2,a=>a+3,console.log); // 6
위 코드를 해석해보자.
...args는 인자들인 (0, f(), f(), f(), f()) 값들을 [0, f(), f(), f(), f()] 로 변환해준다.
위의 reduce 함수에 의해 args 배열의 0 번째 값인 0이 reduce 함수의 첫 인자인 a가 되고
그 다음 보조함수가 a=>a+1로 들어가게 된다.
따라서 reduce 함수가 문제 없이 실행되게 된다.