为什么赢得Array.prototype.reduce()将空对象文字作为initialValue?

时间:2015-06-03 19:04:12

标签: javascript arrays

我正在努力完成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。那为什么它认为它未定义?这种语法不允许吗?

1 个答案:

答案 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
    }, {});
}