关于javascript:标题案例一句话?

Title case a sentence?

我正在尝试在javascript中对字符串进行大小写调整-到目前为止,我有以下代码:这似乎不是第一个字母的大写,而且我还坚持如何将第一个字母后的所有字母都小写。

1
2
3
4
5
6
7
8
9
function titleCase(str) {
  var newstr = str.split("");
  for(i=0;i<newstr.length;i++){
    newstr[i].charAt(0).toUpperCase();

  }
   newstr = newstr.join("");
   return newstr;
}

要清楚,我希望句子中的每个词都大写。


我能想到的最干净的方法之一是使用ES6,但仍然缺乏适当的.capitalize()字符串原型方法:

1
2
let sent ="these are just some words on paper"
sent.split(' ').map ( ([h, ...t]) => h.toUpperCase() + t.join('').toLowerCase() )

在数组元素字符串上使用析构函数,通过展开运算符(使tail成为字符序列)获取head和tail,该运算符在强制使用小写之前首先联接。或者你可以用一个s => s[0].toUpperCase() + s.substring(1).toLowerCase()来代替它。哦,既然这个问题似乎表明ES5,那么转换是便宜的,尽管明显更冗长:

1
2
3
4
5
6
function capitalize (sentence) {
    return sentence.split(' ').map(
        function (s) {
            return s[0].toUpperCase() + s.substring(1).toLowerCase()      
        }).join(' ') ;
}

也就是说,假设你还想要一个句子。


这应该有效。注意我如何将newstr[i]设置为所需的输出。像.toUpperCase()这样的函数不会影响原始字符串。它们只返回具有所需属性的新字符串。

1
2
3
4
5
6
7
8
9
10
function titleCase(str) {
  var newstr = str.split("");
  for(i=0;i<newstr.length;i++){
    if(newstr[i] =="") continue;
    var copy = newstr[i].substring(1).toLowerCase();
    newstr[i] = newstr[i][0].toUpperCase() + copy;
  }
   newstr = newstr.join("");
   return newstr;
}


这是一个工作代码。您的代码中有问题的一行是:

1
newstr[i].charAt(0).toUpperCase();

这一行得到每个单词的大写首字母,但它与此无关。下面的代码的工作方式是将第一个字符大写,然后附加单词的其余部分,然后将其赋回到newstr[i]中。

1
2
3
4
5
6
7
8
function titleCase(str) {
  var newstr = str.split("");
  for(i=0;i<newstr.length;i++){
    newstr[i] = newstr[i].charAt(0).toUpperCase() + newstr[i].substring(1).toLowerCase();
  }
   newstr = newstr.join("");
   return newstr;
}


如果你喜欢像我一样使用Ramda,你可以做一件干净有趣的事情:

1
2
3
4
5
import { concat, compose, head, join, map, split, tail, toLower, toUpper } from 'ramda';    
const toWords = split(' ');
const capitalizeWords = map(s => concat(toUpper(head(s)), toLower(tail(s))));
const toSentence = join(' ');
const toTitleCase = compose(toSentence, capitalizeWords, toWords);

当然,你也可以把它减少到

1
2
const capitalizeWords = map(s => concat(toUpper(head(s)), toLower(tail(s))));
const toTitleCase = compose(join(' '), capitalizeWords, split(' '));

1
2
3
function capitalizeFirstLetter(string) {
    return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
}

此函数将第一个字母大写,其余部分将小写。

从这里找到的完美答案开始,函数发生了一些变化:如何在javascript中将字符串的第一个字母变为大写?


首先全部变为小写,然后打开每个单词,然后打开每个字母,第一个字母设置为大写,然后一起打开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function titleCase(str) {
  var copy=str;
  copy=copy.toLowerCase();
  copy=copy.split(' ');
  for(var i=0;i<copy.length;i++){
    var cnt=copy[i].split('');
    cnt[0]=cnt[0].toUpperCase();
    copy[i]=cnt.join('');
   
   
  }
  str=copy.join(' ');
  return str;
}

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


这里有一个function titleCase(string, array),它把一个字符串转换成标题大小写,每个单词的第一个字母都大写,除了某些介词、冠词和连词。如果一个单词跟在冒号后面,它将始终大写。您可以包括一个可选数组来忽略您选择的字符串,例如缩写词。

我可能遗漏了ignore数组中的一些异常词。请随意添加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function titleCase(str, array){

  var arr = [];
  var ignore = ["a","an","and","as","at","but","by","for","from","if","in","nor","on","of","off","or","out","over","the","to","vs"];
  if (array) ignore = ignore.concat(array);
  ignore.forEach(function(d){
    ignore.push(sentenceCase(d));
  });

  var b = str.split("");

  return b.forEach(function(d, i){
    arr.push(ignore.indexOf(d) == -1 || b[i-1].endsWith(":") ? sentenceCase(d) : array.indexOf(d) != -1 ? d : d.toLowerCase());
  }), arr.join("");

  function sentenceCase(x){
    return x.toString().charAt(0).toUpperCase() + x.slice(x.length-(x.length-1));
  }

}

var x = titleCase("james comey to remain on as FBI director", ["FBI"]);
console.log(x); // James Comey to Remain on as FBI Director
var y = titleCase("maintaining substance data: an example");
console.log(y); // Maintaining Substance Data: An Example


1
2
3
4
5
6
7
8
9
10
function titleCase(str) {
  var newArr = str.toLowerCase().split(""),
  firstLetter,
  updArr = [];
  for(var i=0;i<newArr.length;i+=1){
    firstLetter = newArr[i].slice(0,1);
    updArr.push(newArr[i].replace(firstLetter, firstLetter.toUpperCase()));
  }
  return updArr.join("");
}


我的解决方案

1
2
3
4
5
6
7
8
9
10
function titleCase(str) {

var myArr = str.toLowerCase().split("");

for (var a = 0; a < myArr.length; a++){
     myArr[a] = myArr[a].charAt(0).toUpperCase() + myArr[a].substr(1);
  }

  return myArr.join("");
}


我最近使用与第一个字母匹配的regex重新发现了这个问题,并解释了撇号。希望能有所帮助:

1
2
3
4
5
6
7
function titleCase(str) {

return str.toLowerCase().replace(/^\w|\s\w/g, function(firstLetter) {
    return firstLetter.toUpperCase();
  });
}
titleCase("I'm a little tea pot");


1
2
3
4
5
6
7
8
9
10
11
12
13
function titleCase(str) {
    var titleStr = str.split(' ');

    for (var i = 0; i < titleStr.length; i++) {

        titleStr[i] = titleStr[i].charAt(0).toUpperCase() + titleStr[i].slice(1).toLowerCase();

    }

    return titleStr.join(' ');
}

titleCase("i'm a little tea pot")


1
2
3
4
5
6
7
8
9
10
11
function titleCase(str){
    var strToArray = str.split("");
    var newArray = [];      

    for(var i=0; i < strToArray.length; i++){
        var element = strToArray[i].replace(strToArray[i][0], strToArray[i][0].toUpperCase());
        newArray.push(element);
    }

    return (newArray.join(""));
}