Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重复第一个字母时设置名称的大小写格式_Javascript_Arrays_String_Replace - Fatal编程技术网

Javascript 重复第一个字母时设置名称的大小写格式

Javascript 重复第一个字母时设置名称的大小写格式,javascript,arrays,string,replace,Javascript,Arrays,String,Replace,我有一个函数,它接受一个名称数组并返回一个新数组,每个名称的第一个字母都转换为大写(其余字母为小写) 我将收到所需的>数组[“Jackson”、“Pam”、“William”]的输出 但是,有一种情况下,此功能不起作用。如果我使用重复第一个字母的名称调用函数,则除了第二个字母外,每个字母都是小写的 例如,如果我将gEORGANN添加到前面的示例中,我将收到以下输出: >数组[“乔治安”、“杰克逊”、“帕姆”、“威廉”] 如何解决这个问题?您当前的逻辑并没有按照您认为的那样进行。考虑在每个名称的循

我有一个函数,它接受一个名称数组并返回一个新数组,每个名称的第一个字母都转换为大写(其余字母为小写)

我将收到所需的
>数组[“Jackson”、“Pam”、“William”]
的输出

但是,有一种情况下,此功能不起作用。如果我使用重复第一个字母的名称调用函数,则除了第二个字母外,每个字母都是小写的

例如,如果我将
gEORGANN
添加到前面的示例中,我将收到以下输出:

>数组[“乔治安”、“杰克逊”、“帕姆”、“威廉”]


如何解决这个问题?

您当前的逻辑并没有按照您认为的那样进行。考虑在每个名称的循环中出现的以下行:

name = name.replace(name[i], name[i].toLowerCase());
这将仅用该字母的小写版本替换等于
name[i]
的第一个字符。这就是如何通过输入
gEORGANN
摆脱您的逻辑。首先,将第一个
g
大写,以获得
GEORGANN
。然后,当循环到达第四个位置,即大写的
G
,它将第一个
G
替换为小写的
G
。这就给我们留下了乔治安,但这不是你想要的。原因是,
replace
只命中第一个匹配项

您可以通过执行“全部替换”而不是“替换”来解决此问题。但是,为什么不将第一个大写字符与其余的小写字符串连接起来呢

arr=['georGann','jACKSON','pAM','wiLliAm'];
newArr=[];
arr.forEach(函数(名称){
newName=name.charAt(0).toUpperCase()+name.substring(1).toLowerCase()
newArr.push(newName);
});
控制台日志(arr);

控制台日志(newArr)您的编码逻辑很好。问题在于操作顺序。请参阅下文

函数capMe(arr){
设newArr=[];
arr.forEach(函数(名称){
name=name.toLowerCase();
name=name.replace(名称[0],名称[0].toUpperCase());
newArr.push(名称);
});
返回newArr;
}
log(capMe(['gEORGANN','pAM','wiLliAm','AA'])给你:
const capMe=(arr=[])=>{
返回arr.map((名称)=>{
常量[第一,…剩余]=名称;
返回`${first.toUpperCase()}${rest.join(''.toLowerCase()}`;
});
}

log(capMe(['foo','foZBaz']) OP可能会考虑添加一个由“或”或“-”组成的字符串,对于具有多个或陌生名字的人,“这是替换所有与名称[I]相等的字符”-不,没有<代码> G < /代码>标志,它正在取代第一个。@TimBiegeleisen-不要假设否决票来自何处。这可能碰巧解决了OP的问题,但这可能不是最好的解决方法。如果输入中有两个相同的大写字符,这将不起作用。@TimBiegeleisen更正。我指出他的逻辑是正确的,这是有原因的。这不是做“是”的最好方式。但这个答案更符合他/她的思路,正如昆汀在上面的评论所说:——)NMD(不是我的反对票),但也许你也应该试着解释一下OP目前的做法失败的原因。我有点太草率了。但这不值得投反对票,我同意+1。工作代码通常不值得否决票+1。
console.log(capMe(['jACKSON', 'pAM', 'wiLliAm']));
name = name.replace(name[i], name[i].toLowerCase());