【问题标题】:How to add a space between camel case key name?如何在驼峰键名之间添加空格?
【发布时间】:2019-08-19 13:53:03
【问题描述】:

我创建了一个 node.js 网站,潜在员工可以通过该网站申请工作。当他们提交申请表时,我正在使用 nodemailer 和 mailgun 向招聘经​​理发送一封包含申请人信息的电子邮件。它使用键值对发送新申请人的对象,但我想在包含多个单词的键之间放置一个空格,并使它们大写以更美观。我该怎么做?

这是一个带有输出键值对的示例电子邮件

这是发送电子邮件的代码

function sendAppliedEmail(applicant) {


let html = '<img src="" alt="logo">';
  html += '<h2 style="color: black">New Applicant</h2>'
  html += '<ul>';

  Object.entries(applicant).forEach(([key, value]) => {
    html += `<li>${key}: ${value}</li>`;
  });

  html += '</ul>';

【问题讨论】:

标签: javascript html json mailgun nodemailer


【解决方案1】:

您可以使用替换函数来确定一个字母是否为大写,如果是则返回一个带前缀的空格,同时确保第一个字符大写。

key.replace(/[a-z]/gi, (m, o) => (m < {} && o) ? ` ${m}` : (o) ? m : m.toUpperCase())

简要说明

您可以通过将字符与{} 进行比较来确定该字符是否大写。如果一个字符小于,则大写,如果大于,则小写。这是因为{} 将转换为字符串[object Object],并且将比较两个字符代码。比较后仅使用第一个字符(“[”)。因此"A" &lt; "[""A" &lt; {} 是等价的。这通过查看它们的字符代码更容易解​​释:

"A".charCodeAt(0);
 //65
"[".charCodeAt(0);
 //91
"a".charCodeAt(0);
 //97

(事实上,使用“[”的性能更高,为了优化,您可以与之比较。更容易记住“{}”大于大写字符,反之亦然)

为什么要这样做?

在典型的 RegEx 中,您可以简单地使用 [A-Z] 来获取大写字符,但需要注意的是,如果您希望将第一个字符和空格骆驼大小写成大写,除了 offset 参数(认为replace 函数中的它作为字符串的索引)允许您在单次遍历字符串中这样做。


一个例子:

let splitCase = key => key.replace(/[a-z]/gi, (m, o) => (m < "[" && o) ? ` ${m}` : (o) ? m : m.toUpperCase());

let key = "phoneNumber";
console.log(splitCase(key));

key = "firstName";
console.log(splitCase(key));

在您的代码中:

下面的 sn-p 不起作用,但它应该在您的代码中工作:

function sendAppliedEmail(applicant) {
let splitCase = (key) => key.replace(/[a-z]/gi, (m, o) => (m < "[" && o) ? ` ${m}` : (o) ? m : m.toUpperCase());

let html = '<img src="" alt="logo">';
  html += '<h2 style="color: black">New Applicant</h2>'
  html += '<ul>';

  Object.entries(applicant).forEach(([key, value]) => {
    html += `<li>${splitCase(key)}: ${value}</li>`;
  });

  html += '</ul>';

【讨论】:

    【解决方案2】:
    replace(/([a-z])([A-Z])/g, `$1 $2`)
    


    您可以替换所有 lowerUpper 匹配项。

    每当一个小写字符后跟一个大写字符时,正则表达式都会匹配并将这两个字符替换为它们自己和一个空格。

    function sendAppliedEmail(applicant) {
    
    
    let html = '<img src="" alt="logo">';
      html += '<h2 style="color: black">New Applicant</h2>'
      html += '<ul>';
    
      Object.entries(applicant).forEach(([key, value]) => {
        html += `<li>${key.replace(/([a-z])([A-Z])/g, `$1 $2`)}: ${value}</li>`;
      });
    
      html += '</ul>';
    


    如果键应该是完整的大写,您可以将toUpperCase() 方法链接到替换方法。

    html += `<li>${key.replace(/([a-z])([A-Z])/g, `$1 $2`).toUpperCase()}: ${value}</li>`;
    

    【讨论】:

    • 在简单性方面做得很好!我的类似,但我不确定是否需要将初始字符大写:)
    • 感谢您的帮助!很棒的答案
    【解决方案3】:

    您可以使用正则表达式在大写字符上分割它们。看到这个问题:Javascript Split string on UpperCase Characters

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-19
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      • 2023-01-10
      • 2019-10-24
      • 1970-01-01
      相关资源
      最近更新 更多