我相信你之前就已经收到了关于这个问题的建议,但使用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'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"]