我正在努力完成NodeJS推荐的functional-javascript-workshop
教程(练习6)。
我编写了以下简单代码,它应该计算数组中每个单词的出现次数,并将结果作为对象返回,其中每个键值对都是word: # of occurrences
。
function countWords (inputWords) {
return inputWords.reduce(function (obj, current) {
obj[current] = typeof obj[current] === 'number' ? obj[current] + 1 : 1;
}, {});
}
如果我使用countWords(['bob'])
运行它,我会收到错误:Uncaught TypeError: Cannot read property 'bob' of undefined
。克拉指向第三行的typeof obj[current]
表达式。
如果我在console.log(obj)
函数的第一行reduce()
,则输出Object {}
。如果我在第一行console.log(typeof obj)
,则会输出object
。那为什么它认为它未定义?这种语法不允许吗?
答案 0 :(得分:4)
函数的返回值将用作obj
中下一个值的inputWords
参数。由于您未明确返回任何内容,因此JavaScript返回undefined
。这就是你得到错误的原因。要解决此问题,您需要返回obj
。
function countWords (inputWords) {
return inputWords.reduce(function (obj, current) {
obj[current] = typeof obj[current] === 'number' ? obj.current + 1 : 1;
return obj; // Return the accumulated value
}, {});
}
无论如何,通过考虑默认情况下未知密钥将返回undefined
这一事实,您的逻辑可以简化一点,就像这样
function countWords(inputWords) {
return inputWords.reduce(function (obj, current) {
obj[current] = (obj[current] || 0) + 1;
return obj; // Return the accumulated value
}, {});
}