我正在尝试将给定字符串的每个首字母大写,但是每次运行代码时都会收到以下错误:
TypeError: val[i].charAt(...).到大写(...)。联接不是函数
function titleCase(str) {
var strArry = str.toLowerCase().split(' ');
strArry.map(function (val) {
for (var i = 0; i < val.length; i++) {
return val[i].charAt(0).toUpperCase().join(' ') + strArry[i].splice(1);
};
});
}
titleCase("I'm a little tea pot");
>String.protoype.toUpperCase()
返回一个字符串,Array.prototype.join()
在数组原型上,而不是字符串上。
你可能想要这样的东西...
return val[i].charAt(0).toUpperCase() + val[i].slice(1);
。甚至可能更好(至少更短)...
function titleCase(str) {
return str.replace(/b[a-z]/g, function(match) { return match.toUpperCase(); });
}
在这里,我使用正则表达式来匹配单词边界后的第一个小写字母,然后使用自定义替换器将其返回大写。
如果您支持的不仅仅是拉丁语,请使用 Unicode 范围来选择字符。
toUpperCase
返回一个String
,join
不是该原型上的方法。
如果你运行代码并在处理字符串之前进行typeof
检查,你可以看到:
function titleCase(str) {
var strArry = str.toLowerCase().split(' ');
strArry.map(function (val) {
for (var i = 0; i < val.length; i++) {
var temp = val[i].charAt(0).toUpperCase();
console.log(typeof temp);
return temp;
};
});
}
titleCase("I'm a little tea pot");
您需要在映射Array
后join
以生成最终的组合值。
我提出了这段运行良好的简短代码:
var titleCase = (str) => str.split(" ").map(el => el[0].toUpperCase().concat(el.substr(1))).join(" ");
console.log(titleCase("I'm a little tea pot"));
通过一些研究弄清楚了,发现使用 val 与我一起尝试使用 mpa()
function titleCase(str) {
var strArry = str.toLowerCase().split(' ');
var convert = strArry.map(function(val) {
return val.replace(val.charAt(0), val.charAt(0).toUpperCase());
});
return convert.join(' ');
}
titleCase("I'm a little tea pot");
熟悉Javascript,这就是为什么我不知道它是否在char和string之间有区别。
我很确定你的意思是做一件完全不同的事情,即返回一个由大写字母连接的字符串。然而,你在这里(尝试)做的是在你的 for 循环的第一个循环之后返回你的表达式的结果 (val[i].andsoonandsoforth)。
表达式不起作用的原因是 join(string) 通常在字符串或字符数组上调用。但是,您是在单个字符上调用它!
解决方案是首先将 uf 字符串拆分为字符,将它们大写,将它们存储到一个数组中,在该数组上调用 join 然后返回该内容。
或者只是在字符串上使用可能存在的内置大写函数。