如何使用JavaScript算法计算文本字符串中的元音

来自菜鸟教程
跳转至:导航、​搜索

介绍

短语 vanilla JavaScript 通常用于包含在没有框架或库的情况下编写 JavaScript。 虽然许多现代问题可以通过框架和库来解决,但了解 JavaScript 原生可用的内容以及如何以及何时可以依赖它们将帮助您成为更强大的开发人员。

考虑一个场景,您收到不同长度的文本字符串。 您的目标是计算字符串中包含的英语元音(“a”、“e”、“i”、“o”和“u”)(大写和小写)出现的次数。

JavaScript 包含 3 个元音。 DigitalOcean 包含 6 个元音。 Rhythms 包含 0 个元音。

在本文中,您将使用迭代循环构建一个解决方案,并使用正则表达式构建第二个解决方案。

先决条件

如果您想继续阅读本文,您将需要:

  • 具有 Web 开发人员控制台或具有 REPL 实现的沙盒环境的现代 Web 浏览器。
  • 熟悉 loopsStringsArrays 将是有益的。
  • 熟悉 正则表达式 可能是有益的,但不是必需的。

此示例使用 for…ofincludes(),这在旧版浏览器中不受支持。

使用迭代循环

在迭代方法中,您将遍历传递的字符串的每个字母,然后检查是否有任何字母与任何元音匹配。 如果字母与元音的已知可能值匹配,您将增加一个计数器变量。 循环完成后,您可以引用此变量,它将显示元音的数量。

花点时间想一想您将如何分解此任务的要求和步骤。

现在,使用 Web 浏览器中的 Web 开发人员控制台或 REPL 的其他实现,让我们为这个问题构建一个解决方案。

首先,让我们定义你所知道的:

const vowels = ["a", "e", "i", "o", "u"]

这段代码声明了一个常量 - vowels - 它包含一个由五个英语元音组成的数组。

然后,让我们创建一个传递 text 值的函数:

const vowels = ["a", "e", "i", "o", "u"]

function countVowelsIterative(text) {

}

在此函数内部,您将 counter 变量初始化为 0

const vowels = ["a", "e", "i", "o", "u"]

function countVowelsIterative(text) {
  let counter = 0

  console.log(`The text contains ${counter} vowel(s)`)

  return counter
}

此代码将向控制台记录一条消息,并且 return counter 变量的值。

接下来,要遍历字符串,可以使用 for...of 循环:

const vowels = ["a", "e", "i", "o", "u"]

function countVowelsIterative(text) {
  let counter = 0

  for (let letter of text.toLowerCase()) {

  }

  console.log(`The text contains ${counter} vowel(s)`)

  return counter
}

for…of 循环遍历 可迭代对象 - 字符串、数组、映射、集合等。

此代码还将 text 中的所有字符转换为小写。 可能还有其他需要区分大小写的场景,但对于这种特定场景,您可以使用 toLowerCase() 并避免同时定义大写元音。

然后,您可以使用 if 语句来检查 letter 是否与 vowels 中的任何一个匹配:

const vowels = ["a", "e", "i", "o", "u"]

function countVowelsIterative(text) {
  let counter = 0

  for (let letter of text.toLowerCase()) {
    if (vowels.includes(letter)) {

    }
  }

  console.log(`The text contains ${counter} vowel(s)`)

  return counter
}

这段代码对vowels的数组使用includes()方法判断数组是否包含选中的letter,返回true还是false,视情况而定。

最后,如果条件为 true,则可以递增 counter 变量:

const vowels = ["a", "e", "i", "o", "u"]

function countVowelsIterative(text) {
  let counter = 0

  for (let letter of text.toLowerCase()) {
    if (vowels.includes(letter)) {
      counter++
    }
  }

  console.log(`The text contains ${counter} vowel(s)`)

  return counter
}

考虑用户可能提交的 text 的可能值,并确保您的函数正确处理每个值。

一个空字符串:

countVowelsIterative('')

您期望返回的值应为 0

OutputThe text contains 0 vowel(s)

没有元音的字符串:

countVowelsIterative('Rhythms')

您期望返回的值应为 0

OutputThe text contains 0 vowel(s)

以及带有一个或多个元音的字符串:

countVowelsIterative('DigitalOcean')

您期望返回的数值等于字符串中元音出现的次数:

OutputThe text contains 6 vowel(s)

您已成功开发出一种迭代循环解决方案,用于计算一串文本中英语元音的出现次数。

使用正则表达式

正则表达式(正则表达式)帮助您在字符串中查找模式或字符组合。

对于这种特殊情况,正则表达式非常适合计算文本字符串中英语元音的出现次数。

正则表达式可用于许多编程语言,并用于解决许多需要搜索、匹配和过滤的问题。 熟悉正则表达式将为您的开发人员技能增加一种更强大的工具。

花点时间想一想您将如何分解此任务的要求和步骤。

现在,使用 Web 浏览器中的 Web 开发人员控制台或 REPL 的其他实现,让我们为这个问题构建一个解决方案。

让我们创建一个传递 text 值的函数:

function countVowelsRegex(text) {

}

您可以使用带有模式 [aeiou] 的正则表达式,而不是包含元音的数组:

/[aeiou]/gi

对于简单的模式,正则表达式通常定义在一对斜杠中(/)。 方括号([])用于指定“字符类”。 正则表达式将搜索在此字符类中匹配的任何字符。

在结束斜线之后,使用字母 gi。 满足条件后,正则表达式将停止。 使用 g 进行全局搜索将继续执行附加搜索。 使用 i 进行不区分大小写的搜索可以避免还必须定义大写元音。

然后,对 text 应用正则表达式:

function countVowelsRegex(text) {
  let matchingInstances = text.match(/[aeiou]/gi);
}

此代码使用 match() 方法。

如果存在匹配,则将返回与正则表达式匹配的所有实例。 如果不匹配,则返回 null 值。

检查 matchingInstances 值是否存在并处理这两种情况:

function countVowelsRegex(text) {
  let matchingInstances = text.match(/[aeiou]/gi);

  if (matchingInstances) {
    console.log(`The text contains ${matchingInstances.length} vowel(s)`)

    return matchingInstances.length
  } else {
    return 0
  }
}

如果 matchingInstances 计算结果为真值(即找到的匹配数组),您会记录一条格式化消息,显示元音的数量与数组的 length 相同。 然后,您返回号码。

如果 matchingInstances 计算结果为假值,则返回 0 因为这意味着没有找到匹配项。

考虑用户可能提交的 text 的可能值,并确保您的函数正确处理每个值。

带有一个或多个元音的字符串:

countVowelsRegex('DigitalOcean')

您期望返回的数值等于字符串中元音出现的次数:

OutputThe text contains 6 vowel(s)

您已成功开发了一个正则表达式解决方案,用于计算文本字符串中英语元音的出现次数。

结论

在本文中,您成功实现了两个解决方案,用于计算 JavaScript 文本字符串中元音的数量。 在设计解决方案的过程中,您将问题分解为小步骤并利用 JavaScript 中可用的方法。

迭代循环方法使用字符串、数组、for…oftoLowerCase()ifincludes() 和增量。

正则表达式方法使用字符串、数组、match()if…elselength()

为您的项目选择解决方案需要考虑可读性和性能优化等因素。

通过探索可用于字符串和数组的其他方法来继续学习。