Javascript 为什么不是';这不是reduceworking(JS)的递归定义吗?

Javascript 为什么不是';这不是reduceworking(JS)的递归定义吗?,javascript,recursion,reduce,Javascript,Recursion,Reduce,我试图使用递归函数重新定义Javascript的reduce。 这是我的尝试,但没有成功。如果有人能稍微改变一下,让它工作起来,那就太好了,因为我会更好地理解它。(这是一个练习) 它给了我以下神秘的错误信息,我不知道如何解释: /usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:13 prev[curr] = ++prev[curr] || 1

我试图使用递归函数重新定义Javascript的reduce。 这是我的尝试,但没有成功。如果有人能稍微改变一下,让它工作起来,那就太好了,因为我会更好地理解它。(这是一个练习)

它给了我以下神秘的错误信息,我不知道如何解释:

/usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:13
    prev[curr] = ++prev[curr] || 1
                            ^

TypeError: Cannot create property 'undefined' on string 'exercitation'
    at /usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:13:29
    at reduce (/home/david/node-school/functional-workshop/solution.js:7:28)
    at /usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:12:10
    at obtainResult (/usr/local/lib/node_modules/functional-javascript-workshop/exercises/runner.js:100:21)
    at Exercise.<anonymous> (/usr/local/lib/node_modules/functional-javascript-workshop/exercises/runner.js:66:27)
    at next (/usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:188:19)
    at /usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:195:7
    at Exercise.<anonymous> (/usr/local/lib/node_modules/functional-javascript-workshop/exercises/runner.js:34:5)
    at next (/usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:188:19)
    at /usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:195:7
/usr/local/lib/node_modules/functional javascript workshop/exercises/basic_recursion/exercise.js:13
上一次[当前]=++上一次[当前]| 1
^
TypeError:无法在字符串“exercuition”上创建属性“undefined”
at/usr/local/lib/node_modules/functional javascript workshop/exercises/basic_recursion/exercise.js:13:29
在reduce(/home/david/node school/functional workshop/solution.js:7:28)
at/usr/local/lib/node_modules/functional javascript workshop/exercises/basic_recursion/exercise.js:12:10
在获得结果时(/usr/local/lib/node_modules/functional javascript workshop/exercises/runner.js:100:21)
在运动中。(/usr/local/lib/node_modules/functional javascript workshop/exercises/runner.js:66:27)
接下来(/usr/local/lib/node_modules/functional javascript workshop/node_modules/workshopper exercise/exercise.js:188:19)
at/usr/local/lib/node_modules/functional javascript workshop/node_modules/workshopper exercise/exercise.js:195:7
在运动中。(/usr/local/lib/node_modules/functional javascript workshop/exercises/runner.js:34:5)
接下来(/usr/local/lib/node_modules/functional javascript workshop/node_modules/workshopper exercise/exercise.js:188:19)
at/usr/local/lib/node_modules/functional javascript workshop/node_modules/workshopper exercise/exercise.js:195:7

您需要更新累加器:

功能减少(arr、fn、acc){
if(阵列长度){
var newArr=arr.slice(1,arr.length);
acc=fn(arr[0],acc)
收益减少(新收益、fn、acc);
}否则{
返回acc;
}
}

log(reduce([1,2,3],(val,sum)=>sum+val,0))
您忘记将累加器的当前值,即
initial
,传递到
fn
调用中。

正如其他人所指出的,您没有将累加器传递到
fn
。如果您很好奇,
reduce
可以用一个三元(
?:
)表达式来表示–而且,
arr.slice(1)
将从
1
切片到数组的末尾;在这种情况下,不需要指定切片的结尾

const reduce=(arr、fn、acc)=>
arr.length==0
? 行政协调会
:减少(arr.slice(1),fn,fn(acc,arr[0]))
常数加=(x,y)=>x+y

log(reduce([1,2,3],add,0))/6
只是想知道:
if(arr.length)
有效吗?我总是使用
if(arr.length>0)
…您没有向我们显示正确的代码。在您的
解决方案.js
的第7行调用后,
exercise.js
中出现错误。@Danmoreng,它测试真实值
fn
initial
应该是数组中元素的
索引吗?@guest271314 fn是用于减少数组的任何函数dude遵守
/usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:13
    prev[curr] = ++prev[curr] || 1
                            ^

TypeError: Cannot create property 'undefined' on string 'exercitation'
    at /usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:13:29
    at reduce (/home/david/node-school/functional-workshop/solution.js:7:28)
    at /usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:12:10
    at obtainResult (/usr/local/lib/node_modules/functional-javascript-workshop/exercises/runner.js:100:21)
    at Exercise.<anonymous> (/usr/local/lib/node_modules/functional-javascript-workshop/exercises/runner.js:66:27)
    at next (/usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:188:19)
    at /usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:195:7
    at Exercise.<anonymous> (/usr/local/lib/node_modules/functional-javascript-workshop/exercises/runner.js:34:5)
    at next (/usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:188:19)
    at /usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:195:7