字母表 - 每个字母在字符串中出现的次数(包括 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() 来获取我们的数组,因此迭代顺序由规范而不是实现来保证。