字母表 - 每个字母在字符串中出现的次数(包括 0)
Map of alphabet - how many times each letter occurs in a string (including 0)
我正在编写一个函数,该函数 returns 一个数组,其中包含每个字母 (a-z) 在字符串中出现的次数,包括 0。此数组仅包含 26 个数字。到目前为止,这是我想出的功能。它有效,但我觉得重构此解决方案必须是一种更简洁的方法。
export function generateMap(text){
const text_arr = text.toLowerCase().split('');
const valid_char = 'abcdefghijklmnopqrstuvwxyz'.split('')
const map = {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 0, 'm': 0, 'n': 0, 'o': 0, 'p': 0, 'q': 0, 'r': 0, 's': 0, 't': 0, 'u': 0, 'v': 0, 'w': 0, 'x': 0, 'y': 0, 'z': 0}
text_arr.forEach(char => {
if(valid_char.indexOf(char) > -1) map[char]++
})
return Object.values(map)
}
编辑:
export function generateMap(text){
var text_arr = text.toLowerCase().split('').sort();
const valid_char = 'abcdefghijklmnopqrstuvwxyz'.split('').sort();
const map = {};
valid_char.forEach(char => {
var count = text_arr.lastIndexOf(char) + 1;
text_arr = text_arr.slice(count);
map[char] = count;
});
return Object.values(map)
}
sort()
valid_char
是保修。
由于您使用的是 ES6,让我们尝试使用一些附加功能来扩展 Map
以使其变得简单。我们将添加一个用于语义递增的 update()
函数,以及一个 returns 默认值(例如 0
)的 get()
函数,如果键不存在于地图还没有:
class DefaultMap extends Map {
constructor (defaultValue, iterable = []) {
super(iterable)
this.default = defaultValue
}
get (key) {
if (this.has(key)) {
return super.get(key)
}
return this.default
}
update (key, fn) {
this.set(key, fn(this.get(key)))
}
}
const initialCharCode = 'a'.charCodeAt(0)
// generate the valid characters from the ASCII table a-z
const validChars = Array.from(
{length: 26},
(value, index) => String.fromCharCode(index + initialCharCode)
)
function generateMap (text) {
const chars = text.replace(/[^a-z]/gi, '').toLowerCase().split('')
const map = new DefaultMap(0)
chars.forEach(char => map.update(char, count => count + 1))
return validChars.map(validChar => map.get(validChar))
}
console.log(generateMap('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'))
然后我们在函数 generateMap()
之外静态地定义一次 validChars
因为我们只需要这样做一次。我们还通过映射 validChars
而不是在 map
上调用 Object.values()
来获取我们的数组,因此迭代顺序由规范而不是实现来保证。
我正在编写一个函数,该函数 returns 一个数组,其中包含每个字母 (a-z) 在字符串中出现的次数,包括 0。此数组仅包含 26 个数字。到目前为止,这是我想出的功能。它有效,但我觉得重构此解决方案必须是一种更简洁的方法。
export function generateMap(text){
const text_arr = text.toLowerCase().split('');
const valid_char = 'abcdefghijklmnopqrstuvwxyz'.split('')
const map = {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 0, 'm': 0, 'n': 0, 'o': 0, 'p': 0, 'q': 0, 'r': 0, 's': 0, 't': 0, 'u': 0, 'v': 0, 'w': 0, 'x': 0, 'y': 0, 'z': 0}
text_arr.forEach(char => {
if(valid_char.indexOf(char) > -1) map[char]++
})
return Object.values(map)
}
编辑:
export function generateMap(text){
var text_arr = text.toLowerCase().split('').sort();
const valid_char = 'abcdefghijklmnopqrstuvwxyz'.split('').sort();
const map = {};
valid_char.forEach(char => {
var count = text_arr.lastIndexOf(char) + 1;
text_arr = text_arr.slice(count);
map[char] = count;
});
return Object.values(map)
}
sort()
valid_char
是保修。
由于您使用的是 ES6,让我们尝试使用一些附加功能来扩展 Map
以使其变得简单。我们将添加一个用于语义递增的 update()
函数,以及一个 returns 默认值(例如 0
)的 get()
函数,如果键不存在于地图还没有:
class DefaultMap extends Map {
constructor (defaultValue, iterable = []) {
super(iterable)
this.default = defaultValue
}
get (key) {
if (this.has(key)) {
return super.get(key)
}
return this.default
}
update (key, fn) {
this.set(key, fn(this.get(key)))
}
}
const initialCharCode = 'a'.charCodeAt(0)
// generate the valid characters from the ASCII table a-z
const validChars = Array.from(
{length: 26},
(value, index) => String.fromCharCode(index + initialCharCode)
)
function generateMap (text) {
const chars = text.replace(/[^a-z]/gi, '').toLowerCase().split('')
const map = new DefaultMap(0)
chars.forEach(char => map.update(char, count => count + 1))
return validChars.map(validChar => map.get(validChar))
}
console.log(generateMap('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'))
然后我们在函数 generateMap()
之外静态地定义一次 validChars
因为我们只需要这样做一次。我们还通过映射 validChars
而不是在 map
上调用 Object.values()
来获取我们的数组,因此迭代顺序由规范而不是实现来保证。