2

以下函数应将句子中每个单词的首字母大写(str)!不幸的是,它不起作用,我找不到解决方案!

function titleCase(str) {
  let arr = str.toLowerCase().split(" ");
  for (let i = 0; i < arr.length; i++) {
    arr[i].charAt(0).toUpperCase();
  }
  return arr.join(" ");
}

console.log(titleCase("I'm a little tea pot"));

4

3 回答 3

3

您需要分配大写字母的结果,并将其连接到单词的其余部分:

function titleCase(str) {
  let arr = str.toLowerCase().split(" ");
  for (let i = 0; i < arr.length; i++) {
    arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
  }
  return arr.join(" ");
}

console.log(titleCase("I'm a little tea pot"));

它也更容易使用map

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

console.log(titleCase("I'm a little tea pot"));

于 2019-04-13T23:23:10.943 回答
1

arr是一个字符串数组,但字符串是不可变的——简单地调用toUpperCase()一个字符只会给你一个新的大写字符的引用,而不会改变原始字符串。您需要显式地重新分配数组项:

function titleCase(str) {
  let arr = str.toLowerCase().split(" ");
  for (let i = 0; i < arr.length; i++) {
    arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1);
  }
  return arr.join(" ");
}

console.log(titleCase("I'm a little tea pot"));

或者,也许更优雅的是,您可以使用正则表达式。下面使用lookbehind,它适用于Chrome、Opera和Node的最新版本;lookbehind 使代码看起来更干净,但并非所有地方都支持它:

const titleCase = str => str.replace(
  /(?<=^|\s)\S/g,
  firstChar => firstChar.toUpperCase()
);

console.log(titleCase("I'm a little tea pot"));

或者,没有后视:

const titleCase = str => str.replace(
  /(\S)(\S*)/g,
  (_, firstChar, rest) => firstChar.toUpperCase() + rest
);

console.log(titleCase("I'm a little tea pot"));

于 2019-04-13T23:22:00.713 回答
0

您可以通过这种方式更新您的代码

  • 首先将所有字符小写
  • 循环遍历字符串索引
  • 如果 index 是0或是index - 1空格字符,则将其str[index]设为大写
  • 继续附加一个字符串并在最后返回

function titleCase(str) {
 let LowerCaseStr = str.toLowerCase()
 let final =''
 for (let i = 0; i < LowerCaseStr.length; i++) {
   if(i === 0 || LowerCaseStr[i-1] === ' '){
     final += LowerCaseStr[i].toUpperCase()
   } else{
     final += LowerCaseStr[i]
   }
 }
return final
}

console.log(titleCase("I'm a little tea pot"));

于 2019-04-14T01:43:46.047 回答