javascript - 第一个字母重复时名称的格式大小写
问题描述
我有一个函数,它接受一个名称数组并返回一个新数组,每个名称的第一个字母转换为大写(其余字母小写)。
function capMe(arr) {
let newArr = [];
arr.forEach(function(name) {
name = name.replace(name[0], name[0].toUpperCase());
for(let i = 1; i < name.length; i++) {
name = name.replace(name[i], name[i].toLowerCase());
}
newArr.push(name);
});
return newArr;
}
这在绝大多数时间都有效。例如,如果我这样调用函数:
console.log(capMe(['jACKSON', 'pAM', 'wiLliAm']));
我将收到所需的输出> Array ["Jackson", "Pam", "William"]
。
但是,有一种情况,此功能不起作用。如果我使用重复第一个字母的名称调用该函数,则每个字母都将是小写,除了第二次出现的字母。
例如,如果我添加gEORGANN
到前面的示例,我将收到以下输出:
> Array ["georGann", "Jackson", "Pam", "William"]
我该如何解决这个问题?
解决方案
您当前的逻辑并没有按照您的想法进行。考虑出现在每个名称的循环中的以下行:
name = name.replace(name[i], name[i].toLowerCase());
这仅替换与该字母的小写版本相等的第一个字符。name[i]
这就是如何用 input 抛弃你的逻辑gEORGANN
。首先,你把第一个大写g
,得到GEORGANN
。然后,当循环到达第四个位置时,即大写字母G
,它将第 G
一个替换为小写字母g
。这给我们留下了gEORGANN
,但这不是您想要的。这样做的原因是replace
第一次出现。
您可以通过全部替换而不是替换来解决此问题。但是为什么不直接将大写的第一个字符与小写字符串的其余部分连接起来:
arr = ['georGann', 'jACKSON', 'pAM', 'wiLliAm'];
newArr = [];
arr.forEach(function(name) {
newName = name.charAt(0).toUpperCase() + name.substring(1).toLowerCase()
newArr.push(newName);
});
console.log(arr);
console.log(newArr);
推荐阅读
- pandas - 在混合数据框中将真/假转换为 0/1 布尔值
- powershell - 我的 windows 7 机器上的 powershell 配置文件的位置不一致
- spring-boot - 如何在freemarker中将复选框绑定到dto
- c# - 意图重定向漏洞
- javascript - 如何在 eslintrc 文件中使用 import?
- css - 如何在媒体查询中使用两个纵横比?
- asp.net-core - .NET Core SignalR 客户端未连接到 ASP.NET Core 集线器
- sql - 选择查询以根据列值检索单行多值
- php - 当表中的 tr 为空时更改颜色
- r - R中的情节:每个类别的特定颜色