使用array.reduce方法计算重复元素

时间:2014-06-16 21:13:28

标签: javascript arrays reduce

我正在编写关于功能性JS的教程,并且我需要使用reduce方法的挑战:

给定一个随机数组的单词,输出一个数组,显示单词加上它的单词计数,例如:['apple, 'orange, 'grape', 'apple'] - > ['apple: 2','orange: 1', 'grape: 1]

我知道这不是正确使用reduce,但这是我的半工作解决方案:

var wordCountsArray = inputWords.map(function(item){
    var counter = 0;
    var itemCount = inputWords.reduce(function(prevVal, curVal){
        if(curVal==item){
            counter++;
        }
        return;
    },0);

    return item+": "+counter;
})

return wordCountsArray;  

}

这确实输出了单词计数,但单词计数列表有重复,即看起来像:

['apple: 2','orange: 1', 'grape: 1, 'apple: 2']

而不是

['apple: 2','orange: 1', 'grape: 1]

我查了MSDN的方法指南,Mozilla's,几个博客。我得到它作为累加器如何工作,但因为它使用最后一次迭代的输出作为下一个的输入,我不知道如何将它应用于此任务。我不需要解决方案,但在理解方面可能有点帮助?​​

1 个答案:

答案 0 :(得分:7)

我知道这是一个解决方案,但有时解决方案是最好的解释。关注" fruitsCount"第一个块中的对象。请注意" fruitsArray"只是这个对象的翻译,所以应该很容易理解。

var fruits = ['apple', 'orange', 'grape', 'apple'].reduce(function(fruitsCount, currentFruit){
    if(typeof fruitsCount[currentFruit] !== "undefined"){
      fruitsCount[currentFruit]++; 
      return fruitsCount;
    } else {
        fruitsCount[currentFruit]=1; 
        return fruitsCount;
    }
}, {});

var fruitsArray = [];
for(var x in fruits){
    fruitsArray.push(x + ": " + fruits[x]);
}

console.log(fruitsArray);