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
所以目前我正在尝试获取每个字符串在数组中出现的次数。我写了上面的函数,但似乎它有一个bug。
PS:这是https://nodeschool.io/的练习.. npm install -g functional-javascript-workshop。我必须使用reduce函数,我不允许使用任何for / while循环
这是我的输入/输出:
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 ]
研讨会“说”这是错误的。
有人可以帮忙吗?
答案 0 :(得分:1)
由于您在函数开头使用的Array#sort
,研讨会检查可能与您提交的结果的顺序有问题。
您可以使用这些方法进行计数而不更改结果的顺序:
使用array spread语法和Map
的Array#reduce
的ES6字计数器。 Map
计算单词。 Map
将Map#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);
使用带有哈希对象的Array#reduce
的ES5版本。
var 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' ];
function countWords(arr) {
return words.reduce(function(m, w) {
// if the hash doesn't include the word
if (!m.hash.hasOwnProperty(w)) {
// push a new count of 0 to that word
m.counts.push(0)
// add the index of the word's count
m.hash[w] = m.counts.length - 1;
}
// increment the count at the index of the word's count
m.counts[m.hash[w]]++;
return m;
}, { hash: {}, counts: [] }).counts; // return the counts array
}
var result = countWords(words);
console.log(result);