I'm not sure my answer exactly answers the question, but I hope this can help someone.
An example without using a prototype and loops:
const origArr = [2,2] const origFunc = (p,c) => p+c const initial = 1 const reduce = (func, array, initial) => { const rec = (arr, acc) => { // arr: [2, 2], [2], [] // acc: 1, 3, 5 if (!arr.length) return acc const curr = arr[0] const nextArr = arr.slice(1) const nextAcc = func(acc, curr) return rec(nextArr, nextAcc) } if (initial) { return rec(array, initial) } return rec(array.slice(1), array[0]) } console.log(origArr.reduce(origFunc, initial)) // 5 console.log(reduce(origFunc, origArr, initial)) // 5
And an example with a loop:
const reduceLoop = (func, array, initial) => { let acc = initial !== undefined ? initial : array[0] let arr = initial !== undefined ? [initial, ...array] : array for(let i=1;i<arr.length;i++) { acc = func(acc, arr[i]) } return acc }
As you can see, in the first example we do not assign variables, we just have some constants, but in the loop example we assign the variable acc .
source share