如何使用reduce方法计算字符串中的字母数

时间:2015-04-20 20:34:12

标签: javascript methods reduce

我试图创建一个计算重复字母值的函数,我想特别使用reduce函数。

    letterFrequency('aaAabb dddDD hhcc')
    Should return: [['d',5], ['a',4], ['b',2], ['c',2], ['h',2]]

我想在不使用任何循环的情况下专门执行此操作。谢谢!

这是我试图做的问题: http://www.codewars.com/kata/53e895e28f9e66a56900011a/train/javascript

但我想用reduce函数来做。

3 个答案:

答案 0 :(得分:3)

我会将一些问题分开。我没有尝试编写完成上述所有操作的reduce函数,而是将其分为3个部分。

减少功能

此功能旨在传递给.reduce电话。它计算传递给它的项目的频率。

function duplicates(frequency, letter) {
  frequency[letter] = frequency[letter] + 1 || 1;
  return frequency;
}

转换函数

此函数将常规Javascript对象转换为您指定的格式。

function transform(hash) {
  var keys = Object.keys(hash);
  return keys.map(function(key) {
    return [key, hash[key]];
  });
}

包装函数

此功能包围其他两个以创建所需的输出。

function findFrequencies(string) {
  var freqs = string
    .toLowerCase()
    .split('')
    .reduce(duplicates, {});

  return transform(freqs);
}

排序功能

最后,如果你想对频率进行排序,那么你可以编写一个可以使用这种类型的排序函数。

var frequencies = [['d',5], ['a',4], ['b',2], ['c',2], ['h',2]];
frequencies.sort(function(a, b) {
  return a[1] - b[1];
});

答案 1 :(得分:0)

首先将结果存储在对象中,然后将其转换为数组。 e.g。

function letterFrequency(str) {
  var map = str.replace(/\s+/g, '').split("").reduce(function(result, c) {
    var count = result[c] || 0;
    result[c] = count + 1;
    return result;
  }, {});
  return Object.keys(map).map(function(k) { return [k, map[k]]});
}

答案 2 :(得分:0)

紩!你们打败了我。

基本上我将所有值都推送到地图中,然后将该地图转换为列表

var someString = 'aaAabb dddDD hhcc';
var map = {};

// piece of characters I don't need in the result
var unallowedChars = [" "];

someString.split('').reduce(function(previous, current, index, context) {
    // is the current value allowed?
    // let's do something!
    if (unallowedChars.indexOf(current) < 0) {
        if (!map.hasOwnProperty(current)) {
            map[current] = 0;
        }
        map[current]++;   
    }
});

然后是:

/**
 * @param {}
 * @return []
 */
var transformMap = function(map) {
    var transformedMap = []
    for (key in map) {
        transformedMap.push([key, map[key]]);
    }

    return transformedMap;
}

console.log(transformMap(map));

我请求原谅错误