我很确定您之前就这个问题得到了建议,但使用的是 ES5 方法(您可以自己将其降级为 for 循环)。
function titleCase(str1) {
return str1.toLowerCase().split(' ').map(function(word) {
return word.charAt(0).toUpperCase() + word.slice(1);
}).join(' ');
}
document.body.textContent = titleCase("I'm a little tea potty");
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.4.1/es5-shim.min.js"></script>
现在,你的代码怎么了?
function capitalize(str) {
return str.toUpperCase();
}
function titleCase(str1) {
str1 = str1.toLowerCase();
var arr = str1.split(' ');
var l = arr.length;
var m;
for (var i = 0; i < l; i++) {
m = arr[i].length;
for (var j = 0; j < m; j++) {
if (j === 0) {
arr[i][0] = capitalize(arr[i][0]);
} else {
arr[i][j] = arr[i][j];
}
}
}
return arr;
}
document.body.textContent = titleCase("I'm a little tea potty");
让我们一点一点来看看:
function capitalize(str) {
return str.toUpperCase();
}
上面没有错,只是功能化似乎毫无意义。
所以,现在我们有了你的函数,你接受一个参数(一个字符串),然后你把它全部小写
function titleCase(str1) {
str1 = str1.toLowerCase();
所以你的字符串"I'm a little tea potty" 出现了,它变成了"i'm a little tea potty"。到现在为止还挺好。然后你在空格处分割它。
var arr = str1.split(' ');
var l = arr.length;
var m;
随之而来的是你的字符串,变成var arr = ["i'm","a","little","tea","potty"];,l变成5,这个数组的长度。
接下来你打算循环遍历数组arr,看起来不错
for (var i = 0; i < l; i++) {
所以对于数组(迭代)中的每个单词(一个字符串),你得到字符串的长度,第一个i'm 是3。
m = arr[i].length;
然后你打算迭代单词中的每个字符,这样就可以了
for (var j = 0; j < m; j++) {
那么,如果它是单词的第一个字符,那么我想要一个大写字母,否则什么都不做。
if (j === 0) {
arr[i][0] = capitalize(arr[i][0]);
} else {
arr[i][j] = arr[i][j];
}
但问题是,您尝试将字符写回字符串,这是不可变的。没有错误被抛出,只是没有任何变化,就像字符串有一个只读开关,就像在存储卡上一样。因此,您的循环将继续进行,什么也不做,直到一切都完成。然后你返回数组。
return arr;
令人惊讶的是,这与将句子拆分为单词时一样。 ["i'm","a","little","tea","potty"]