var name = "AlbERt EINstEiN";
function nameChanger(oldName) {
var finalName = oldName;
// Your code goes here!
finalName = oldName.toLowerCase();
finalName = finalName.replace(finalName.charAt(0), finalName.charAt(0).toUpperCase());
for(i = 0; i < finalName.length; i++) {
if (finalName.charAt(i) === " ")
finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());
}
// Don't delete this line!
return finalName;
};
// Did your code work? The line below will tell you!
console.log(nameChanger(name));
我的代码原样,返回'Albert einstein'。我想知道我哪里出错了? 如果我加入
console.log(finalName.charAt(i+1));
在if语句之后,并注释掉其余部分,它会打印'e',因此它会识别charAt(i+1)
,就像它应该......我只是无法将它用于大写第二个单词的第一个字母。< / p>
答案 0 :(得分:4)
您的代码示例存在两个问题。我会一个接一个地浏览它们。
字符串是不可变的
这并不像你认为的那样工作:
finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());
您需要将其更改为:
finalName = finalName.replace(finalName.charAt(i+1), finalName.charAt(i+1).toUpperCase());
在JavaScript中,字符串不可变。这意味着一旦创建了一个字符串,就无法更改它。这可能听起来很奇怪,因为在您的代码中,您似乎正在使用finalName
等方法在整个循环中更改字符串replace()
。
但实际上,你并没有真正改变它! replace()
函数接受输入字符串,进行替换,产生新的输出字符串,因为它实际上不允许更改输入字符串(不变性)。所以,如果你没有通过将replace()
的输出分配给变量来捕获finalName = finalName.replace(...)
的输出,那么替换后的字符串就会丢失。
顺便说一下,将它分配回原始变量名称是可以的,这就是为什么你可以replace()
。
替换是贪婪的
您遇到的另一个问题是,当您使用replace()
时,您将替换字符串中匹配字符的所有,而不仅仅是在你正在检查的位置。这是因为slice()
是贪婪的 - 如果你告诉它取代&#39; e&#39;用&#39; E&#39;,它将取代所有这些!
基本上,您需要做的是:
if (finalName.charAt(i) === " ") {
// Get ONLY the letter after the space
var startLetter = finalName.slice(i+1, i+2);
// Concatenate the string up to the letter + the letter uppercased + the rest of the string
finalName = finalName.slice(0, i+1) + startLetter.toUpperCase() + finalName.slice(i+2);
}
方法可以执行您想要的操作:
$newArray = array_filter($orders, function($v)use($del_itemid, $del_modiifier){
if($v["itemid"] == $del_itemid && $v["modifier"] == $del_modiifier)
return FALSE;
return TRUE;
});
另一种选择是正则表达式(正则表达式),其他答案提到了。这可能是一个更好的选择,因为它更清洁。但是,如果您是第一次学习编程,通过编写原始循环可以更容易地理解这个手工字符串的工作。以后你可以搞乱这种有效的方法。
工作jsfiddle:http://jsfiddle.net/9dLw1Lfx/
进一步阅读:
答案 1 :(得分:4)
如果将 RegExp /pattern/flags
和函数传递到str.replace
而不是使用子字符串
function nameChanger(oldName) {
var lowerCase = oldName.toLowerCase(),
titleCase = lowerCase.replace(/\b./g, function ($0) {return $0.toUpperCase()});
return titleCase;
};
在此示例中,我已在word boundary \b
之后将更改应用于任何字符.
,但您可能需要更具体的/(^| )./g
答案 2 :(得分:1)
这个问题的另一个好答案是使用RegEx为你做这件事。
var re = /(\b[a-z](?!\s))/g;
var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon";
s = s.replace(re, function(x){return x.toUpperCase();});
console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon"
正在使用的正则表达式可能需要略微更改,但这可以让您了解使用正则表达式可以做什么
答案 3 :(得分:1)
问题是双重的:
1)您需要为finalName.replace返回一个值,因为该方法返回一个元素,但不会改变它所谓的元素。
2)你没有迭代字符串值,所以你只是改变了第一个单词。你不想改变每个单词,所以它是小写的大写字母吗?
此代码可以更好地为您服务:
var name = "AlbERt EINstEiN";
function nameChanger(oldName) {
// Your code goes here!
var finalName = [];
oldName.toLowerCase().split(" ").forEach(function(word) {
newWord = word.replace(word.charAt(0), word.charAt(0).toUpperCase());
finalName.push(newWord);
});
// Don't delete this line!
return finalName.join(" ");
};
// Did your code work? The line below will tell you!
console.log(nameChanger(name));
答案 4 :(得分:-4)
if (finalName.charAt(i) === " ")
不应该
if (finalName.charAt(i) == " ")
不检查===检查对象类型是否相等,不应该是一个char,另一个是字符串。