Convert string to title case with JavaScript

后端 未结 30 2787
夕颜
夕颜 2020-11-21 06:40

Is there a simple way to convert a string to title case? E.g. john smith becomes John Smith. I\'m not looking for something complicated like John R

相关标签:
30条回答
  • 2020-11-21 07:41

    My one line solution:

    String.prototype.capitalizeWords = function() {
        return this.split(" ").map(function(ele){ return ele[0].toUpperCase() + ele.slice(1).toLowerCase();}).join(" ");
    };
    

    Then, you can call the method capitalizeWords() on any string. For example:

    var myS = "this actually works!";
    myS.capitalizeWords();
    
    >>> This Actually Works
    

    My other solution:

    function capitalizeFirstLetter(word) {
        return word[0].toUpperCase() + word.slice(1).toLowerCase();
    }
    String.prototype.capitalizeAllWords = function() {
        var arr = this.split(" ");
        for(var i = 0; i < arr.length; i++) {
            arr[i] = capitalizeFirstLetter(arr[i]);
        }
        return arr.join(" ");
    };
    

    Then, you can call the method capitalizeWords() on any string. For example:

    var myStr = "this one works too!";
    myStr.capitalizeWords();
    
    >>> This One Works Too
    

    Alternative solution based on Greg Dean answer:

    function capitalizeFirstLetter(word) {
        return word[0].toUpperCase() + word.slice(1).toLowerCase();
    }
    String.prototype.capitalizeWords = function() {
        return this.replace(/\w\S*/g, capitalizeFirstLetter);
    };
    

    Then, you can call the method capitalizeWords() on any string. For example:

    var myString = "yes and no";
    myString.capitalizeWords()
    
    >>> Yes And No
    
    0 讨论(0)
  • 2020-11-21 07:42

    Just in case you are worried about those filler words, you can always just tell the function what not to capitalize.

    /**
     * @param String str The text to be converted to titleCase.
     * @param Array glue the words to leave in lowercase. 
     */
    var titleCase = function(str, glue){
        glue = (glue) ? glue : ['of', 'for', 'and'];
        return str.replace(/(\w)(\w*)/g, function(_, i, r){
            var j = i.toUpperCase() + (r != null ? r : "");
            return (glue.indexOf(j.toLowerCase())<0)?j:j.toLowerCase();
        });
    };
    

    Hope this helps you out.

    edit

    If you want to handle leading glue words, you can keep track of this w/ one more variable:

    var titleCase = function(str, glue){
        glue = !!glue ? glue : ['of', 'for', 'and', 'a'];
        var first = true;
        return str.replace(/(\w)(\w*)/g, function(_, i, r) {
            var j = i.toUpperCase() + (r != null ? r : '').toLowerCase();
            var result = ((glue.indexOf(j.toLowerCase()) < 0) || first) ? j : j.toLowerCase();
            first = false;
            return result;
        });
    };
    
    0 讨论(0)
  • 2020-11-21 07:43

    Surprised to see no one mentioned the use of rest parameter. Here is a simple one liner that uses ES6 Rest parameters.

    let str="john smith"
    str=str.split(" ").map(([firstChar,...rest])=>firstChar.toUpperCase()+rest.join("").toLowerCase()).join(" ")
    console.log(str)

    0 讨论(0)
  • 2020-11-21 07:44

    You could immediately toLowerCase the string, and then just toUpperCase the first letter of each word. Becomes a very simple 1 liner:

    function titleCase(str) {
      return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase());
    }
    
    console.log(titleCase('iron man'));
    console.log(titleCase('iNcrEdible hulK'));

    0 讨论(0)
  • 2020-11-21 07:45
    "john f. kennedy".replace(/\b\S/g, t => t.toUpperCase())
    
    0 讨论(0)
  • 2020-11-21 07:45

    Use /\S+/g to support diacritics:

    function toTitleCase(str) {
      return str.replace(/\S+/g, str => str.charAt(0).toUpperCase() + str.substr(1).toLowerCase());
    }
    
    console.log(toTitleCase("a city named örebro")); // A City Named Örebro

    However: "sunshine (yellow)" ⇒ "Sunshine (yellow)"

    0 讨论(0)
提交回复
热议问题