如何在驼峰式键名之间添加 space?

How to add a space between camel case key name?

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

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

这是发送邮件的代码

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 Split string on UpperCase Characters

replace(/([a-z])([A-Z])/g, ` `)


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

每当一个小写字符后跟一个大写字符时,正则表达式匹配并用它们自己和一个 space 替换这两个字符。

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, ` `)}: ${value}</li>`;
  });

  html += '</ul>';


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

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

您可以使用替换函数来确定字母是否为大写,如果是,则 return 为字符添加前缀 space,同时确保第一个字符为大写。

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

简要说明

您可以通过与{}比较来判断一个字符是否大写。如果字符 小于 则为大写,如果 大于 则为小写。这是因为 {} 将被转换为字符串 [object Object],并且将比较两个字符代码。比较时只使用第一个字符(“[”)。因此 "A" < "[""A" < {} 是等价的。通过查看它们的字符代码可以更容易地解释这一点:

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

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

为什么要这样做?

在典型的 RegEx 中,您可以简单地使用 [A-Z] 来获取大写字符,但需要注意的是,如果您希望将第一个字符大写并且 space 驼峰式,则此比较还offset 函数中的 offset 参数(将其视为字符串的索引)允许您在 单次遍历字符串时执行此操作。


一个例子:

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));


在您的代码中:

下面的代码片段无法运行,但它应该可以在您的代码中运行:

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>';