Вы можете использовать функцию замены, чтобы определить, является ли буква заглавной буквой, и вернуть префиксный пробел с символом, если он есть, и в то же время убедиться, что первый символ написан с большой буквы.
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]
, чтобы получить заглавные буквы, но предостережениезаключается в том, что если вы хотите использовать заглавные буквы в первом символе И пробел в верблюде, это сравнение в дополнение к параметру 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));
В вашем коде:
Следующий фрагмент кода не работает , но он должен работать в вашем коде:
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>';