标题案例句子 - 哪种解决方案更好,为什么?

时间:2015-12-10 15:52:55

标签: javascript loops map-function

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

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

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

3 个答案:

答案 0 :(得分:2)

哪种解决方案最好?

您的第二个解决方案是最好的,但可以通过在str上链接方法调用并删除valmap的不必要的重新分配来更好:

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
  • 结尾的字符串

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(" ")
}

当然,字边界是一个问题。