获取每个string在一个数组中出现的次数

function countWords(inputWords) { var sortArray = inputWords.sort(function (idx1, idx2) { return idx1.localeCompare(idx2) }); var resultArray = []; var counter = 1; sortArray.reduce(function (total, currentValue) { if (total == currentValue) counter++; else { resultArray.push(counter); counter = 1; } return currentValue; }); return resultArray; } module.exports = countWords 

所以目前我试图获得每个string发生在一个数组中的次数。 我写了上面的函数,但似乎有一个错误。

PS:这是https://nodeschool.io/的练习。npm install -g functional-javascript-workshop。 我必须使用reduce函数,我不允许使用任何for / while循环

那是我的input/输出:

 input: [ 'ad', 'ad', 'ad', 'aliqua', 'aliquip', 'aute', 'consectetur', 'consequat', 'culpa', 'culpa', 'culpa', 'do', 'do', 'dolor', 'dolore', 'eiusmod', 'elit', 'esse', 'esse', 'est', 'et', 'et', 'ex', 'excepteur', 'excepteur', 'exercitation', 'exercitation', 'id', 'id', 'id', 'incididunt', 'labore', 'laborum', 'lorem', 'magna', 'minim', 'minim', 'minim', 'mollit', 'nostrud', 'nulla', 'pariatur', 'proident', 'qui', 'qui', 'reprehenderit', 'reprehenderit', 'sint', 'ullamco', 'velit' ] submission: [ 3, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 2, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 2, 2, 1, 1 ] 

研讨会“说”这是错误的。

有人可以帮忙吗?

由于您在函数启动时使用了Array#sort ,因此您可能会遇到问题。

您可以使用这些方法来计算而不改变结果的顺序:

Array#reduce ES6字计数器,使用数组扩展语法和MapMap计数的话。 MapMap#values转换为一个迭代器,然后通过spread传递给一个数组。

 const words = [ 'ad', 'ad', 'ad', 'aliqua', 'aliquip', 'aute', 'consectetur', 'consequat', 'culpa', 'culpa', 'culpa', 'do', 'do', 'dolor', 'dolore', 'eiusmod', 'elit', 'esse', 'esse', 'est', 'et', 'et', 'ex', 'excepteur', 'excepteur', 'exercitation', 'exercitation', 'id', 'id', 'id', 'incididunt', 'labore', 'laborum', 'lorem', 'magna', 'minim', 'minim', 'minim', 'mollit', 'nostrud', 'nulla', 'pariatur', 'proident', 'qui', 'qui', 'reprehenderit', 'reprehenderit', 'sint', 'ullamco', 'velit' ]; const countWords = (words) => [...words.reduce((m, w) => m.set(w, (m.get(w) || 0) + 1), new Map).values()]; const result = countWords(words); console.log(result);