我试图创建一个计算重复字母值的函数,我想特别使用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函数来做。
答案 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));
我请求原谅错误