使用带索引而不是句子的CharCodeAt

时间:2018-11-20 11:34:19

标签: javascript ecmascript-6

这个问题以前是通过不同的方式提出的,但与这个问题并不相同。我想通过使用ES5或ES6编写一个函数来实现,该函数使用system A = 1, B = 2, C = 3 etc.计算得分最高的单词。字符串在单词之间仅包含一个空格,不会出现标点符号。

我想出了这个功能。

var wordScoreCalculator = s =>
  s.toLowerCase().
  split('').
  map(s => s.charCodeAt(0)-0x60).
  filter(c => 1 <= c && c <= 26).
  reduce((x,y) => x+y, 0);

wordScoreCalculator('I live in this world');

当前,charCodeAt正在映射整个句子,并将所有单词一起计算到208。

我想使其与索引一起使用,以便它分别计算每个单词并仅显示最高分。

在这种情况下,它应该显示72。如何实现?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您需要另外映射每个单词,首先在一个空格上分割。另外,因为根据条件The string will only contain a single space between words and there will be no punctuation,不需要filter,因为听起来单词将始终包含字母字符:

var wordScoreCalculator = s =>
  s.toLowerCase()
  .split(' ')
  .map(word => word
    .split('')
    .map(char => char.charCodeAt(0)-0x60)
    .reduce((x,y) => x+y, 0)
  )
  .reduce((a, b) => Math.max(a, b))

console.log(wordScoreCalculator('I live in this world'));
console.log(wordScoreCalculator('I live in this world zzzz'));

或者可以抽象化将单词映射到其值的操作到其自己的函数中,以提高可读性:

const wordToScore = word => word
  .split('')
  .map(char => char.charCodeAt(0)-0x60)
  .reduce((x,y) => x+y, 0);
const bestWordCalculator = s =>
  s.toLowerCase()
  .split(' ')
  .map(wordToScore)
  .reduce((a, b) => Math.max(a, b));
  
console.log(bestWordCalculator('I live in this world'));
console.log(bestWordCalculator('I live in this world zzzz'));