获取每个字符串在Array中出现的次数

时间:2017-01-07 22:11:19

标签: javascript node.js

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 ]

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

由于您在函数开头使用的Array#sort,研讨会检查可能与您提交的结果的顺序有问题。

您可以使用这些方法进行计数而不更改结果的顺序:

使用array spread语法和MapArray#reduce的ES6字计数器。 Map计算单词。 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);

使用带有哈希对象的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);