标题大小写一个句子 - 哪个解决方案更好,为什么

Title case a sentence - Which solution is better and why?

本文关键字:解决方案 更好 为什么 一个 大小写 标题 句子      更新时间:2023-09-26

我是编程新手。我以两种不同的方式编写了一个解决方案,但想知道什么被认为是更好的解决方案,以及为什么。

此外,就性能而言,为什么会被认为更好?

解决方案 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;
}

哪种解决方案最好?

您的第二个解决方案是最好的,但通过将方法调用链接到str并删除map中不必要的val重新分配可能会更好:

function titleCase(str) {
  return str
      .toLowerCase()
      .split(" ")
      .map(function (val) {
          return val.charAt(0).toUpperCase() + val.slice(1);
      })
      .join(" ");
}

或者使用 ES6,我们可以使用箭头功能减小map块的大小:

function titleCase(str) {
  return str
      .toLowerCase()
      .split(" ")
      .map((val) => val.charAt(0).toUpperCase() + val.slice(1))
      .join(" ");
}

我想说的是,第二种解决方案最好的最明显原因是它更容易理解。通过使用像map这样的命名方法,从一开始就很清楚正在执行哪种操作。查看 for 循环是否正在映射值并不清楚。

____

__

哪个性能最好?

我建议您使用大型数据集测试每个数据集。我怀疑您会发现每种方法之间实际上几乎没有区别,并且由于需要较少的函数调用,第一种方法的执行时间可以忽略不计。

第二个要好得多,因为它可以立即清楚发生了什么,而无需弄清楚循环构造有什么副作用。也可以说它更实用。

也可以缩短为一个简单的链,没有那么多变量赋值,这使得它更容易理解:

function titleCase(str) {
  return str.toLowerCase()
  .split(" ")
  .map(function(val) {
    return val.charAt(0).toUpperCase() + val.slice(1);
  })
  .join(" ");
}

第一个中更复杂的循环结构也是两个错误的原因:

  • 它不会以空格开头的标题大小写字符串
  • 它抛出以空格1 结尾的字符串

当从1循环到length-1时,你应该使用str[i-1] == " "str[i] = …

另请注意,将两种不同的类型分配给同一变量通常被认为是一种不好的做法。处理字符串和字符数组时,应为它们使用两个不同的变量,而不是对两者str

1:诚然,如果您使用 val[0].toUpperCase() 而不是 .charAt(0),第二个函数也会发生同样的情况(对于超出范围的索引,这将产生空字符串而不是 undefined(

我喜欢我的外观,因为它更容易阅读,它使用 lambda 函数,我有一个厚颜无耻的字符串数组访问权限,仅此而已:

function titleCase(str) {
  return str
    .toLowerCase()
    .split(" ")
    .map(word => word[0].toUpperCase() + word.slice(1))
    .join(" ")
}

当然,单词边界是一个问题。