插件窝 干货文章 在 Javascript 中使用此函数将字符串转换为驼峰命名法

在 Javascript 中使用此函数将字符串转换为驼峰命名法

正则 表达式 字符串 单词 78    来源:    2024-10-22

曾经需要将字符串转换为驼峰命名法吗?我在探索开源 supabase 存储库时发现了一个有趣的代码片段。这是他们使用的方法:

function featuretocamelcase(feature: feature) {
  return feature
    .replace(/:/g, '\_')
    .split('\_')
    .map((word, index) => (index === 0 ? word : word\[0\].touppercase() + word.slice(1)))
    .join('') as featuretocamelcase<typeof feature>
}
</typeof>

这个功能非常简洁。它将冒号替换为下划线,将字符串拆分为单词,然后映射每个单词以将其转换为驼峰命名法。第一个单词保持小写,后续单词的第一个字符大写,然后再重新连接在一起。简单又有效!

我在 stack overflow 上发现了另一种不使用正则表达式的方法。这是替代方案:

function tocamelcase(str) {
  return str.split(' ').map(function(word, index) {
    // if it is the first word make sure to lowercase all the chars.
    if (index == 0) {
      return word.tolowercase();
    }
    // if it is not the first word only upper case the first char and lowercase the rest.
    return word.charat(0).touppercase() + word.slice(1).tolowercase();
  }).join('');
}

来自 so 的这段代码片段有注释解释了这段代码的作用,除了它不使用任何类型的正则表达式。 supabase 将字符串转换为驼峰命名方式的代码与此 so 答案非常相似,除了注释和使用的正则表达式。

.replace(/:/g, '\_')

此方法将字符串按空格分割,然后映射到每个单词。第一个单词完全小写,而后续单词的第一个字符大写,其余字符小写。最后,单词重新连接在一起形成驼峰式字符串。

stack overflow 用户的一条有趣评论提到了这种方法的性能优势:

“+1 表示不使用正则表达式,即使问题要求使用正则表达式的解决方案。这是一个更清晰的解决方案,而且在性能方面也取得了明显的胜利(因为处理复杂的正则表达式比仅仅迭代一堆字符串并将它们连接在一起是一项更困难的任务)。请参阅jsperf.com/camel-casing-regexp-or-character-manipulation/1,我在其中举了一些示例以及这个示例(以及我自己对性能的适度改进,尽管我在大多数情况下,为了清晰起见,可能会更喜欢这个版本)。”

两种方法各有优点。 supabase 代码中的正则表达式方法非常简洁,并且利用了强大的字符串操作技术。另一方面,非正则表达式方法因其清晰度和性能而受到称赞,因为它避免了与正则表达式相关的计算开销。

立即学习“Java免费学习笔记(深入)”;

以下是您如何在它们之间进行选择:

  • 如果您需要一个紧凑的、利用 javascript 强大的正则表达式功能的单行解决方案,请使用正则表达式方法。另外,请务必添加注释来解释您的正则表达式的作用,以便您未来的自己或下一个使用您的代码的开发人员能够理解。
  • 如果您优先考虑可读性和性能,请选择非正则表达式方法,特别是在处理较长的字符串或多次运行此转换时。

想学习如何从头开始构建 shadcn-ui/ui 吗?查看 从头开始构建

关于我:

网站:https://ramunarasinga.com/

linkedin:https://www.linkedin.com/in/ramu-narasinga-189361128/

github:https://github.com/ramu-narasinga

电子邮件:ramu.narasinga@gmail.com

从头开始构建 shadcn-ui/ui

参考:

    https://github.com/supabase/supabase/blob/master/apps/studio/hooks/misc/useisfeatureenabled.ts#l16
  1. https://stackoverflow.com/a/35976812