我是编程新手。我已经用两种不同的方式编写了一个解决方案,但想知道什么是更好的解决方案,以及为什么。
此外,就性能而言,为什么会被认为更好?
解决方案1:
function titleCase(str) {
str = str.toLowerCase();
str = str.split("");
str[0] = str[0].toUpperCase();
for(i = 1; i<str.length; i++){
if(str[i+1] == " "){
str[i+2] = str[i+2].toUpperCase();
}
}
str = str.join("");
return str;
}
解决方案2:
function titleCase(str) {
str = str.toLowerCase();
str = str.split(" ");
str = str.map(function(val){
val = val.charAt(0).toUpperCase() + val.slice(1);
return val;
});
str = str.join(" ");
return str;
}
答案 0 :(得分:2)
哪种解决方案最好?
您的第二个解决方案是最好的,但可以通过在str
上链接方法调用并删除val
中map
的不必要的重新分配来更好:
function titleCase(str) {
return str
.toLowerCase()
.split(" ")
.map(function (val) {
return val.charAt(0).toUpperCase() + val.slice(1);
})
.join(" ");
}
或者使用ES6,我们可以使用arrow function缩小map
块的大小:
function titleCase(str) {
return str
.toLowerCase()
.split(" ")
.map((val) => val.charAt(0).toUpperCase() + val.slice(1))
.join(" ");
}
我想说第二种解决方案最好的最明显的原因是它更容易理解。通过使用像map
这样的命名方法,从一开始就很清楚正在执行什么样的操作。目前尚不清楚您正在寻找一个映射值的for循环。
______
哪种效果最佳?
我建议您使用大型数据集测试每个。我怀疑你会发现每种方法之间实际上差别很小,而且由于需要较少的函数调用,第一种方法的执行时间可以忽略不计。
答案 1 :(得分:1)
第二个更好,因为它可以立即清楚发生了什么,而无需弄清楚循环结构有哪些副作用。也可以说它更functional。
它也可以缩短为一个简单的链,没有那么多变量赋值,这使得它更容易理解:
function titleCase(str) {
return str.toLowerCase()
.split(" ")
.map(function(val) {
return val.charAt(0).toUpperCase() + val.slice(1);
})
.join(" ");
}
第一个中更复杂的循环结构也是两个错误的原因:
从1
循环到length-1
时,您应该使用str[i-1] == " "
和str[i] = …
。
另请注意,将两种不同类型分配给同一变量通常被认为是一种不好的做法。在处理字符串和字符数组时,您应该为它们使用两个不同的变量,而不是str
。
1:不可否认,如果你使用val[0].toUpperCase()
而不是.charAt(0)
(因为out-of而产生空字符串而不是undefined
,你的第二个函数会发生同样的情况 - 范围索引)
答案 2 :(得分:-1)
我喜欢我的外观,因为它更容易阅读,它使用lambda函数,我有一个厚颜无耻的字符串数组访问,就是这样:
function titleCase(str) {
return str
.toLowerCase()
.split(" ")
.map(word => word[0].toUpperCase() + word.slice(1))
.join(" ")
}
当然,字边界是一个问题。