是否有一个简单的方法来转换字符串标题大小写?例如,约翰·史密斯变成了约翰·史密斯。我不是在寻找像John Resig的解决方案那样复杂的东西,只是(希望)一些一两行代码。


当前回答

function titleCase(str) {
    str = str.toLowerCase();

    var strArray = str.split(" ");


    for(var i = 0; i < strArray.length; i++){
        strArray[i] = strArray[i].charAt(0).toUpperCase() + strArray[i].substr(1);

    }

    var result = strArray.join(" ");

    //Return the string
    return result;
}

其他回答

首先,通过空格将字符串转换为数组:

var words = str.split(' ');

然后使用数组。映射以创建包含大写单词的新数组。

var capitalized = words.map(function(word) {
    return word.charAt(0).toUpperCase() + word.substring(1, word.length);
});

然后用空格连接新数组:

capitalized.join(" ");

函数titleCase(str) { str = str. tolowercase ();//确保HeLlo在结束时变成HeLlo Var words = str.split(" "); Var大写= words.map(函数(词){ 返回word. charat (0). touppercase () + word. charat。substring(1、word.length); }); 返回大写。加入(" "); } console.log(titleCase(“我是一个小茶壶”));

注意:

这当然有一个缺点。这将只大写每个单词的第一个字母。通过word,这意味着它将每个由空格分隔的字符串视为1个单词。

假设你有:

str = "我是一个小/小茶壶";

这将产生

我是一个小茶壶

与预期相比

我是一个小茶壶

在这种情况下,使用Regex和.replace就可以了:

ES6:

STR .length => ? str [0] .toUpperCase () + str.slice (1) .toLowerCase () :”; STR .replace(/。/g, c => ' \\${c} '); const titleCase =(句子,seps = ' _-/') => { 让wordPattern = new RegExp(“[^ ${逃脱(seps)}] + ', ' g '); 返回的句子。替换(wordPattern,大写); }; console.log(titleCase(“我是一个小/小茶壶。”));

或不含ES6:

函数大写(str) { 返回str.charAt(0).toUpperCase() + str.substring(1, str.length).toLowerCase(); } 函数titleCase(str) { 返回str.replace(/[^\ \/\-\_]+/g,大写); } console.log(titleCase(“我是一个小/小茶壶。”));

var toMatch = "john w. smith";
var result = toMatch.replace(/(\w)(\w*)/g, function (_, i, r) {
      return i.toUpperCase() + (r != null ? r : "");
    }
)

似乎有用… 用上面的测试,“快棕色的狐狸?/跳过/越过了……“C:/程序文件/某些供应商/他们的第二个应用程序/a file1.txt”。

如果你想要2Nd而不是2Nd,你可以更改为/([a-z])(\w*)/g。

第一种形式可以简化为:

function toTitleCase(toTransform) {
  return toTransform.replace(/\b([a-z])/g, function (_, initial) {
      return initial.toUpperCase();
  });
}

基准

博士TL;

这个基准测试的赢家是简单的for循环:

function titleize(str) {
    let upper = true
    let newStr = ""
    for (let i = 0, l = str.length; i < l; i++) {
        // Note that you can also check for all kinds of spaces  with
        // str[i].match(/\s/)
        if (str[i] == " ") {
            upper = true
            newStr += str[i]
            continue
        }
        newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase()
        upper = false
    }
    return newStr
}
// NOTE: you could beat that using charcode and string builder I guess.

细节

我选取了最流行和最独特的答案,并以此为基准。

下面是我MacBook pro上的结果:

为了完整起见,这里是所使用的函数:

str = "the QUICK BrOWn Fox jUMPS oVeR the LAzy doG";
function regex(str) {
  return str.replace(
    /\w\S*/g,
    function(txt) {
      return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }
  );
}

function split(str) {
  return str.
    split(' ').
    map(w => w[0].toUpperCase() + w.substr(1).toLowerCase()).
    join(' ');
}

function complete(str) {
  var i, j, str, lowers, uppers;
  str = str.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  });

  // Certain minor words should be left lowercase unless 
  // they are the first or last words in the string
  lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
  'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
  for (i = 0, j = lowers.length; i < j; i++)
    str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
      function(txt) {
        return txt.toLowerCase();
      });

  // Certain words such as initialisms or acronyms should be left uppercase
  uppers = ['Id', 'Tv'];
  for (i = 0, j = uppers.length; i < j; i++)
    str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
      uppers[i].toUpperCase());

  return str;
}

function firstLetterOnly(str) {
  return str.replace(/\b(\S)/g, function(t) { return t.toUpperCase(); });
}

function forLoop(str) {
  let upper = true;
  let newStr = "";
  for (let i = 0, l = str.length; i < l; i++) {
    if (str[i] == " ") {
      upper = true;
        newStr += " ";
      continue;
    }
    newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase();
    upper = false;
  }
  return newStr;
}

请注意,我故意没有改变原型,因为我认为这是一个非常糟糕的做法,我认为我们不应该在我们的回答中推广这种做法。这只适用于小型代码库,如果只有你一个人在使用它。

如果你想添加任何其他方法来做这个基准测试,请评论一个链接到答案!


EDIT 2022 Mac M1:在我的新电脑上,使用最新的chrome浏览器,拆分胜出。如果您真的关心特定机器上的性能,您应该自己运行基准测试

如果你可以在你的代码中使用第三方库,那么lodash为我们提供了一个帮助函数。

https://lodash.com/docs/4.17.3#startCase

_。startCase (foo栏); // => 'Foo Bar' _.startCase(“——foo bar”); // => 'Foo Bar' _.startCase(“fooBar”); // => 'Foo Bar' _.startCase(“__FOO_BAR__”); // => ' foo bar '

"john f. kennedy".replace(/\b\S/g, t => t.toUpperCase())