Преобразование строки в регистр заголовка с помощью JavaScript

Есть ли простой способ преобразовать строку в регистр заголовка? Например. john smith становится John Smith. Я не ищу чего-то сложного вроде Решение Джона Ресига, просто (надеюсь) какой-то одно- или двухстрочный.

Есть разные методы, есть ли у нас статистика производительности?

theAnubhav 02.10.2016 15:18

@theAnubhav да у нас есть эталон сейчас

Ulysse BN 19.11.2020 13:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
598
2
438 400
60

Ответы 60

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

Вроде работает ... Протестировано с указанным выше: «Быстро-коричневый, лисица? / Прыгает / ^ через ^ ¡ленивую! Собаку ...» и «C: / программные файлы / какой-то поставщик / их 2-е приложение / файл1.txt».

Если вы хотите 2Nd вместо 2nd, вы можете перейти на /([a-z])(\w*)/g.

Первую форму можно упростить как:

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

Попробуй это:

function toTitleCase(str) {
  return str.replace(
    /\w\S*/g,
    function(txt) {
      return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }
  );
}
<form>
  Input:
  <br /><textarea name = "input" onchange = "form.output.value=toTitleCase(this.value)" onkeyup = "form.output.value=toTitleCase(this.value)"></textarea>
  <br />Output:
  <br /><textarea name = "output" readonly onclick = "select(this)"></textarea>
</form>

Может ли кто-нибудь объяснить, почему используется \w\S*, например, вместо \w+ или \w*? Я не знаю, почему вы хотите включать что-либо, кроме пробелов, и поэтому изменить Джим-Боб на Джим-боб.

martinczerwi 09.01.2013 13:17

@martinCzerwi \w\S* также вызвал проблему с Jim-bob на нашей стороне. Использование \w* решило эту проблему.

Bouke 27.02.2013 17:31

/([^\W_]+[^\s-]*) */g решает проблему Jim-Bob, то есть: jim-bob-->Jim-Bob

recursion.ninja 01.06.2013 22:55

Спасибо за код Грег, что здесь означает комментарий Павла? Будет ли это несовместимо с Firefox или IE?

Doug Molineux 22.08.2013 00:00

@PeteHerbertPenito Я предполагаю, что он протестировал его в Chrome 12 и обнаружил, что он работает только с набором символов Latin-1. например toTitleCase ("āšœ") -> "āšœ" (то же самое в Chrome 30)

Carson Myers 31.10.2013 03:49

Если вы желаете использовать jim-bob-->Jim-Bob, вам, вероятно, следует сделать /\b\w+/g. Пример: str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});

vol7ron 17.01.2014 21:20

Как насчет строк с '_', например. 'hot_wheels'. Как следует изменить регулярное выражение, чтобы справиться с этим?

SaurabhM 09.09.2015 02:58

Будь проще, \b\w

Avinash Raj 09.09.2016 16:39

\w\S* используется вместо \w+ или \w*, поэтому такие слова, как Don't, не изменяются до Don'T, но, как указывали другие, \w\S* вызывает проблемы с переносом слов.

doubleDown 01.02.2017 17:59

А как насчет таких имен, как Джон Макдональд и им подобных? Не следует ли оставить все после первой буквы нетронутым (не в нижнем регистре)?

SoluableNonagon 07.02.2018 06:03

Как и многие ответы здесь, это перерывы для входов с одним символом: toTitleCase('f')

Madbreaks 19.09.2018 20:57

Как и многие ответы здесь, это не работает для (1) языков, где регистр заголовка не влияет только на первую букву, и (2) скрипты с использованием дополнительных кодовых точек. То, что он работает для английского языка, не означает, что он работает в целом.

sffc 05.02.2019 21:17

Добавление второго преобразования для исправления некоторых крайних случаев, например Hawke's Bay: str .replace(/\b\w+/g, match => { return match.charAt(0).toUpperCase() + match.substr(1).toLowerCase(); }) .replace(/['’”‘“][A-Z]{1}\b/g, match => { return match.toLowercase(); });

Adam Reis 13.01.2020 12:56

/\b\w+('\w{1})?/g сохраняет Don't и Jim-Bob или Inside/Outside. Также опустите toLowerCase(), чтобы оставить McDonalds как есть.

eagor 15.06.2020 17:42

Это терпит неудачу, когда "ØSTER HUS AS" дает "ØSter Hus As".

André C. Andersen 10.08.2020 17:37

Почему некоторые разработчики настаивают на изменении регистра или удалении пробелов в именах людей? Это действительно обидно, когда какое-то приложение заставляет меня указывать неправильное имя. Я умею писать свое имя! В итоге я редактирую html или отключаю JS, чтобы моя фамилия не испортилась полностью.

Paul 04.02.2021 19:54

Я сделал эту функцию, которая может обрабатывать фамилии (так что это не регистр заголовков), такие как «Макдональд» или «Макдональд», или «О'Тул», или «Д'Орацио». Однако он не обрабатывает немецкие или голландские имена с «van» или «von», которые часто пишутся в нижнем регистре ... Я считаю, что «de» также часто бывает в нижнем регистре, например, «Robert de Niro». Их еще предстоит решить.

function toProperCase(s)
{
  return s.toLowerCase().replace( /\b((m)(a?c))?(\w)/g,
          function(, , , , ) { if (){return .toUpperCase()++.toUpperCase();} return .toUpperCase(); });
}

+1 за узнаваемость имени. Однако он также не обрабатывает "macy" правильно.

brianary 26.06.2013 04:35

Это была единственная функция, которая правильно обрабатывала преобразование верхнего и нижнего регистра в правильный регистр и заметила такие инициалы, как «Виргинские острова США».

Rodrigo Polo 06.08.2016 09:15

Вы можете обойти проблему macy, поместив туда отрицательный прогноз, чтобы \b((m)(a?c))?(\w) стал \b((m)(a?c))?(\w)(?!\s).

Ste 08.11.2019 17:53

Попробуйте применить стиль CSS текстовое преобразование к своим элементам управления.

например: (text-transform: capitalize);

-1. Этот CSS работает, но не работает так, как ожидает большинство людей, потому что, если текст начинается с заглавных букв, эффекта нет. webmasterworld.com/forum83/7506.htm

whitneyland 23.08.2011 21:37

@Akshar: Правило нижнего регистра будет заменено правилом регистра заголовка. Поскольку css не изменяет исходный контент, в результате удаляется правило нижнего регистра (оставляя исходный контент только заглавными), а затем применяется правило titlecase (ничего не делая).

dokkaebi 15.08.2012 23:49

JS используется вне браузеров.

mikemaccana 05.02.2013 17:43

Вопрос был: "Есть ли простой способ преобразовать строку в регистр заголовка?". Этот ответ не преобразует строку. Это стиль, применяемый поверх струны.

kingPuppy 06.09.2019 19:40

Если вы хотите, чтобы данные в вашей базе данных были чистыми, чтобы их можно было аккуратно использовать при передаче сторонним службам или экспорту в CSV, то CSS на самом деле не вариант. CSS предназначен для косметики, и хотя с годами он значительно вырос, и вы можете использовать его для решения подобных проблем, решение остается косметическим и не решает основную проблему.

Adam Reis 13.01.2020 12:53

+1 Вопрос расплывчатый и не объясняет вариант использования. Возможно, они имели в виду преобразование строки с помощью JS, но на самом деле CSS для них работает лучше, как и мой случай.

Christian Sirolli 10.04.2020 07:41

В мусорное ведро, "JavaScript" буквально в вопросе.

Iest 24.04.2020 22:06

Если вы собираетесь отображать текст в браузере, это лучшее решение, потому что он обрабатывает Unicode, который не рассматривается ни в одном из других ответов.

Minas Mina 20.12.2020 13:24

На всякий случай, если вас беспокоят эти слова-вставки, вы всегда можете просто указать функции, что не следует использовать с заглавной буквы.

/**
 * @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();
    });
};

Надеюсь, что это помогает вам.

редактировать

Если вы хотите работать с ведущими связующими словами, вы можете отслеживать эту еще с одной переменной:

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;
    });
};

Вы можете разбить строку на массив. Таким образом, у нас могут быть португальские, испанские, итальянские и французские предлоги: glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');.

Junior Mayhé 26.06.2012 03:58

Это не гарантирует использование заглавных букв в первом слове; т.е. and another thing становится and Another Thing. Просто нужен элегантный способ всегда писать первое слово с большой буквы.

Brad Koch 30.04.2013 18:41

@BradKoch - заполните пробелами, чтобы вы использовали «and», «de» и т. д. В качестве поискового слова, тогда «And Another And Another» заменит на «And Another and Another».

Yimin Rong 04.09.2015 16:19

хорошо, за исключением того, что он также использует заглавные буквы после 'и - например, H'Dy или Number-One

luky 13.07.2019 17:41

Вместо использования тернарного оператора вы можете просто использовать запасной вариант: glue = glue || ['из', 'для', 'и', 'а'];

tm2josep 07.11.2019 17:42

@ tm2josep да, я писал так, как рекомендует Крокфорд, когда отвечал на этот вопрос :-) В тот день прошло 6 лет, но я все еще предпочитаю явное принуждение типов.

fncomp 13.11.2019 22:50

Чуть более элегантный способ адаптации функции Грега Дина:

String.prototype.toProperCase = function () {
    return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};

Назовите это так:

"pascal".toProperCase();

Имейте в виду, что если у вас есть пользователь с тире в имени и он вводит Jo-Ann Smith, этот код преобразует его в Jo-ann Smith (обратите внимание на a в нижнем регистре в Ann).

dbau 07.04.2012 15:23

@daniellmb Почему бы ему не изменить прототип String? Думаю, это хорошее решение. Подумайте об открытых классах ruby, вполне допустимо добавлять функции к существующим классам, и это широко распространено.

marco-fiset 21.09.2012 19:31

@ marco-fiset Потому что это не нравится другим! Плохие вещи случаются, когда у вас есть две библиотеки, которые обе пытаются модифицировать собственные объекты JavaScript с несовместимыми изменениями. Представьте, если бы jQuery и Google Maps следовали этому шаблону проектирования, у вас не могло бы быть и того, и другого на одной странице.

daniellmb 21.09.2012 21:28

@daniellmb Отличный момент. Предоставление префикса имени метода должно помочь избежать этого, так как это сделает метод неперечисляемым.

mikemaccana 05.02.2013 17:42

Мне кажется, что выражение «не изменять собственные объекты JavaScript» похоже на «никогда не использовать goto» или «eval - это зло». Есть много случаев, когда это нормально. Если вы полностью контролируете свой проект и, конечно, не планируете выпускать его как библиотеку, я не вижу проблем с этим методом.

FoxMulder900 23.06.2015 12:15

Вот почему вы не расширяете собственные объекты: eslint.org/docs/rules/no-extend-native

brandonscript 28.06.2016 00:02

По какой-то причине второе слово моих предложений не пишется с заглавной буквы

Kyle Hotchkiss 05.10.2016 00:43

Как и многие ответы здесь, это перерывы для входов с одним символом: 'f'.toProperCase

Madbreaks 19.09.2018 20:56

Вот моя функция, которая преобразуется в регистр заголовка, но также сохраняет определенные аббревиатуры в верхнем регистре и второстепенные слова в нижнем регистре:

String.prototype.toTitleCase = function() {
  var i, j, str, lowers, uppers;
  str = this.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;
}

Например:

"TO LOGIN TO THIS SITE and watch tv, please enter a valid id:".toTitleCase();
// Returns: "To Login to This Site and Watch TV, Please Enter a Valid ID:"

Твой понравился, тоже сталкиваюсь с проблемами при работе с римскими числами ... только что пропатчил с помощью I, II, III, IV и т. д.

Marcelo 21.08.2011 04:19

Слова, поставленные через дефис, должны быть написаны с заглавной буквы. С вашей функцией JIM-BOB не переходит к Jim-Bob, а вместо этого переходит к Jim-bob

recursion.ninja 01.06.2013 21:21

Зафиксированный. Регулярное выражение в третьей строке было изменено с /\w\S*/g на /([^\W_]+[^\s-]*) */g в соответствии с приведенным выше комментарием @awashburn, чтобы решить эту проблему.

Geoffrey Booth 04.06.2013 19:49

Есть ли преимущество, которое можно получить от использования вашего шаблона регулярного выражения по сравнению с /\b\w+/g, который я считаю более понятным?

Michael 28.05.2014 01:14

Не то, чтобы я мог видеть, я просто принимал предложение другого комментатора решить проблему с переносом слов; но ваше регулярное выражение, похоже, работает так же хорошо, а простота всегда лучше. Для потомков и будущих посетителей этого поста, я просто изменил регулярное выражение в третьей строке с /([^\W_]+[^\s-]*) */g на /\b\w+/g согласно комментарию @ Michael; прокомментируйте, если вы обнаружите случай, когда необходимо более сложное регулярное выражение.

Geoffrey Booth 28.05.2014 18:30

Я изменил регулярное выражение 3-й строки на /\b[\w-\']+/g, чтобы разрешить перенос слов и апостроф в словах.

Shamasis Bhattacharya 03.07.2014 18:48

Случай с апострофом, кажется, объясняет, почему /([^\W_]+[^\s-]*) */g был таким сложным; он также правильно обрабатывает фигурные кавычки, чего не делает /\b[\w-\']+/g, поэтому я вернусь к /([^\W_]+[^\s-]*) */g. Он также правильно обрабатывает слова, поставленные через дефис.

Geoffrey Booth 04.07.2014 04:30

Превосходно. Это мне помогло. Измените регулярное выражение на /([^\W_ght+[^\s-\.pting*) * / g, чтобы преобразовать аббревиатуры с точкой в ​​верхний регистр, например i.b.m. Были слова, содержащие '&', поэтому добавлено '& Amp;' понижает.

Sudarshan_SMD 31.07.2014 17:49

Чтобы напомнить нам, что язык запутан, существует фрейдистский идентификатор, который не прописан полностью. Если только вы не кричите, а это такая уж простая вещь.

tylertrotter 17.12.2018 17:44

Это не работает с таким названием, как «Revelation: The Seven Bowls», но в целом довольно неплохо.

PRMan 14.12.2020 23:43

Без использования регулярного выражения только для справки:

String.prototype.toProperCase = function() {
  var words = this.split(' ');
  var results = [];
  for (var i = 0; i < words.length; i++) {
    var letter = words[i].charAt(0).toUpperCase();
    results.push(letter + words[i].slice(1));
  }
  return results.join(' ');
};

console.info(
  'john smith'.toProperCase()
)

Спасибо за решение без регулярных выражений!

lucifer63 22.10.2019 17:22

Попробуй это

String.prototype.toProperCase = function(){
    return this.toLowerCase().replace(/(^[a-z]| [a-z]|-[a-z])/g, 
        function(){
            return .toUpperCase();
        }
    );
};

Пример

var str = 'john smith';
str.toProperCase();

Так же полнофункционально, как решение Джона Ресига, но однострочно: (на основе этот проект github)

function toTitleCase(e){var t=/^(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|vs?\.?|via)$/i;return e.replace(/([^\W_]+[^\s-]*) */g,function(e,n,r,i){return r>0&&r+n.length!==i.length&&n.search(t)>-1&&i.charAt(r-2)!= = ":"&&i.charAt(r-1).search(/[^\s-]/)<0?e.toLowerCase():n.substr(1).search(/[A-Z]|\../)>-1?e:e.charAt(0).toUpperCase()+e.substr(1)})};

console.info( toTitleCase( "ignores mixed case words like iTunes, and allows AT&A and website.com/address etc..." ) );

jQuery тоже будет однострочным, если вы удалите все символы новой строки. ;)

Charles Burns 04.12.2012 22:25

Было бы хорошо, если бы это был четкий, хорошо отформатированный код, а не уменьшенный.

Rob Evans 05.08.2013 15:39

> однострочный> имеет точку с запятой

Nick Bull 24.09.2020 11:37

var result =
  'this is very interesting'.replace(/\b[a-z]/g, (x) => x.toUpperCase())

console.info(result) // This Is Very Interesting

Просто вопрос, конструкция () предназначена для определения соответствия любой последовательности параметров: то есть (a | b) соответствует a или b. Что делает конструкция (.)?

Michael Blackburn 31.12.2014 00:17

Для всех, у кого был такой же вопрос, он определяет замену «blob», которая используется в разделе замены. Капли нумеруются последовательно, первый () помещается в $ 1, второй - в $ 2. Я нашел этот сайт полезным: javascript.info/tutorial/regular-expressions-methods

Michael Blackburn 31.12.2014 00:34

Я не могу заставить вышеуказанное работать, но я далек от мастера регулярных выражений. Я использую 'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;}). Опять же, это работает только для заглавной буквы в строке, но в случае, если это то, что вам нужно, моя конструкция работает.

Michael Blackburn 31.12.2014 00:39

По какой-то причине FF35, кажется, задыхается от ''.toUpperCase(), кажется, что прописные буквы не были выполнены к моменту присвоения значения. Обошелся с помощью функции 'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })

MrYellow 26.01.2015 02:20

Всем привет, ответ исправлен! Я почти уверен, что к тому времени, когда я опубликовал его, он работал. В любом случае спасибо за вклад!

simo 18.05.2016 15:28

Вот моя версия, ИМО, она проста для понимания и элегантна.

var str = "foo bar baz"

console.info(

str.split(' ')
   .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())
   .join(' ')

)
// returns "Foo Bar Baz"

В качестве альтернативы вы можете строчные буквы в отображении: str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')

Dave Land 15.08.2016 19:39

Я не согласен с тем, чтобы называть .toLowerCase(). В таких именах, как «Макдональдс» или в акронимах, таких как «как можно скорее», должны сохраняться заглавные буквы. Если кто-то действительно передал строку вроде «heLLO», приложение не должно предполагать, что прописные буквы неверны.

Thomas Higginbotham 01.02.2017 21:22

@ThomasHigginbotham Как насчет этого? String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }

Sean Kendle 02.02.2017 19:26

Да, предпочтительнее предоставить возможность принудительно использовать строчные буквы.

Thomas Higginbotham 02.02.2017 19:43

Да, это легко понять, но когда я пробую это, на самом деле ничего не пишется с заглавной буквы (по какой-то причине).

Katinka Hesselink 07.12.2017 11:25

Это сломается, если str - одиночный символ.

Madbreaks 19.09.2018 20:52

Это сломается, если str содержит последовательные пробелы

Gove 24.10.2020 01:37

Похоже, это самое быстрое решение :)

Ulysse BN 19.11.2020 13:57

Большинство этих ответов, похоже, игнорируют возможность использования метасимвола границы слова (\ b). Более короткая версия ответа Грега Дина с его использованием:

function toTitleCase(str)
{
    return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); });
}

Также работает с именами через дефис, такими как Jim-Bob.

Это элегантное частичное решение, но оно не работает со строками с диакритическими знаками или прописными буквами. Я получаю "София Вергара" => "София Вергара" или "София ВЕРГАРА" => "София ВЕРГАРА". Второй случай может быть решен с помощью функции apply .toLowerCase () перед .replace (...). В первом случае нужно найти правильное регулярное выражение.

Asereware 30.09.2014 22:31

Хм, это похоже на ошибку в реализации регулярного выражения, я бы подумал, что акцентированные символы должны быть символами слова (хотя вы правы, как есть, это не работает для этих случаев).

lewax00 02.10.2014 03:20

\w включает только символы [A-Za-z0-9_], а не все буквы. Для этого вам нужно использовать категорию Unicode \p{L}. Вам понадобится модификатор /u (см. здесь) и другое решение для \b, которое работает только между \W и \w (см. здесь)

cmbuckley 13.11.2019 03:16

Взяв решение "lewax00", я создал это простое решение, которое заставляет "w" начинаться с пробела или "w", которые запускают слово, но не может удалить лишние промежуточные пробелы.

"SOFÍA vergara".toLowerCase().replace(/\b(\s\w|^\w)/g, function (txt) { return txt.toUpperCase(); });

Результат - "София Вергара".

Это не коротко, но вот что я придумал на недавнем школьном задании:

var myPoem = 'What is a jQuery but a misunderstood object?'
//What is a jQuery but a misunderstood object? --> What Is A JQuery But A Misunderstood Object?

  //code here
var capitalize = function(str) {
  var strArr = str.split(' ');
  var newArr = [];
  for (var i = 0; i < strArr.length; i++) {
    newArr.push(strArr[i].charAt(0).toUpperCase() + strArr[i].slice(1))
  };
  return newArr.join(' ')  
}

var fixedPoem = capitalize(myPoem);
alert(fixedPoem);

function toTitleCase(str) {
  var strnew = "";
  var i = 0;

  for (i = 0; i < str.length; i++) {
    if (i == 0) {
      strnew = strnew + str[i].toUpperCase();
    } else if (i != 0 && str[i - 1] == " ") {
      strnew = strnew + str[i].toUpperCase();
    } else {
      strnew = strnew + str[i];
    }
  }

  alert(strnew);
}

toTitleCase("hello world how are u");

Это однострочное решение, если вы хотите преобразовать каждую работу в строке, разделите строку на «», выполните итерацию по частям и примените это решение к каждой части, добавьте каждую преобразованную часть в массив и объедините ее с помощью «».

var stringToConvert = 'john';
stringToConvert = stringToConvert.charAt(0).toUpperCase() + Array.prototype.slice.call(stringToConvert, 1).join('');
console.info(stringToConvert);

Прототип решения Грега Дина:

String.prototype.capitalize = function() {
  return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}

Более простая, более производительная версия с простым кешированием.

  var TITLE_CASE_LOWER_MAP = {
    'a': 1, 'an': 1, 'and': 1, 'as': 1, 'at': 1, 'but': 1, 'by': 1, 'en':1, 'with': 1,
    'for': 1, 'if': 1, 'in': 1, 'of': 1, 'on': 1, 'the': 1, 'to': 1, 'via': 1
  };

  // LEAK/CACHE TODO: evaluate using LRU.
  var TITLE_CASE_CACHE = new Object();

  toTitleCase: function (title) {
    if (!title) return null;

    var result = TITLE_CASE_CACHE[title];
    if (result) {
      return result;
    }

    result = "";
    var split = title.toLowerCase().split(" ");
    for (var i=0; i < split.length; i++) {

      if (i > 0) {
        result += " ";
      }

      var word = split[i];
      if (i == 0 || TITLE_CASE_LOWER_MAP[word] != 1) {
        word = word.substr(0,1).toUpperCase() + word.substr(1);
      }

      result += word;
    }

    TITLE_CASE_CACHE[title] = result;

    return result;
  },

Это основано на моем решении для Костер FreeCodeCamp "Титульный случай", которое требует, чтобы вы сначала преобразовали данную строку во все строчные буквы, а затем преобразовали каждый символ, идущий через пробел, в верхний регистр.

Без использования регулярного выражения:

function titleCase(str) {
 return str.toLowerCase().split(' ').map(function(val) { return val.replace(val[0], val[0].toUpperCase()); }).join(' ');
}

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;
}

String.prototype.capitalize = function() {
    return this.toLowerCase().split(' ').map(capFirst).join(' ');
    function capFirst(str) {
        return str.length === 0 ? str : str[0].toUpperCase() + str.substr(1);
    }
}

Использование:

"hello world".capitalize()

Прекрасно, кроме String.prototype. Не связывайтесь со встроенными объектами!

Travis Webb 03.10.2016 06:58

Если регулярное выражение, используемое в приведенных выше решениях, сбивает вас с толку, попробуйте этот код:

function titleCase(str) {
  return str.split(' ').map(function(val){ 
    return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase();
  }).join(' ');
}

любить это! без преобразования в массивы.

neelmeg 29.04.2016 08:03

эээ ... splitделает преобразует его в массив, вы просто не видите это так очевидно, потому что map означает, что вам не нужно использовать нотацию []

MalcolmOcean 21.07.2016 15:05

Это то же самое, что и Ответ a8m двумя годами ранее.

Michael 15.08.2017 17:42

не совсем то же самое; это использует старый стиль function вместо синтаксиса нового стиля => для функции сопоставления

AlexChaffee 12.09.2017 01:45

Разрывы для ввода с одним символом.

Madbreaks 19.09.2018 20:51

@AlexChaffee проверьте историю изменений. a8m не использовал стрелку в исходном ответе.

Thank you 13.11.2018 17:42

Моя простая и легкая версия проблемы:

    function titlecase(str){
    var arr=[];  
    var str1=str.split(' ');
    for (var i = 0; i < str1.length; i++) {
    var upper= str1[i].charAt(0).toUpperCase()+ str1[i].substr(1);
    arr.push(upper);
     };
      return arr.join(' ');
    }
    titlecase('my name is suryatapa roy');

Используйте /\S+/g для поддержки диакритических знаков:

function toTitleCase(str) {
  return str.replace(/\S+/g, str => str.charAt(0).toUpperCase() + str.substr(1).toLowerCase());
}

console.info(toTitleCase("a city named örebro")); // A City Named Örebro

Однако: «sunshine (yellow)» ⇒ «Sunshine (yellow)»

Просто еще одна версия, которую нужно добавить в смесь. Это также проверит, равна ли string.length 0:

String.prototype.toTitleCase = function() {
    var str = this;
    if (!str.length) {
        return "";
    }
    str = str.split(" ");
    for(var i = 0; i < str.length; i++) {
        str[i] = str[i].charAt(0).toUpperCase() + (str[i].substr(1).length ? str[i].substr(1) : '');
    }
    return (str.length ? str.join(" ") : str);
};

Надежный способ функционального программирования для Title Case Function

Версия Exaplin

function toTitleCase(input){
    let output = input
        .split(' ')  // 'HOw aRe YOU' => ['HOw' 'aRe' 'YOU']
        .map((letter) => {
            let firstLetter = letter[0].toUpperCase() // H , a , Y  => H , A , Y
            let restLetters = letter.substring(1).toLowerCase() // Ow, Re, OU => ow, re, ou
            return firstLetter + restLetters // conbine together
        })
        .join(' ') //['How' 'Are' 'You'] => 'How Are You'
    return output
}

Версия реализации

function toTitleCase(input){
    return input
            .split(' ')
            .map(i => i[0].toUpperCase() + i.substring(1).toLowerCase())
            .join(' ') 
}

toTitleCase('HoW ARe yoU') // reuturn 'How Are You'

Почему не просто function toTitleCase(input){ return input.....join(' ') }

mplungjan 08.08.2017 18:15

Вы можете сразу toLowerCase строку, а затем просто toUpperCase первую букву каждого слова. Становится очень простым 1 лайнер:

function titleCase(str) {
  return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase());
}

console.info(titleCase('iron man'));
console.info(titleCase('iNcrEdible hulK'));

Мне нравится это решение; красиво и просто. Похоже, что в ваш ответ был добавлен фрагмент CoffeeScript (s => s.toUpperCase()). Мой вариант делать то, что вы сделали, но расширения объекта String (как спорный, как есть): Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})

Waz 21.04.2017 12:14

@Waz, спасибо за идеи! Просто хотел прояснить =>, то есть собственная стрелочная функция (ES6), ссылка переходит на документацию Mozillla на них, которая также предоставляет таблицу поддержки.

KevBot 21.04.2017 18:27

Большое спасибо ... ищите что-то короткое и точное

Partha Paul 07.12.2020 00:04

ES6 один лайнер

const toTitleCase = string => string.split(' ').map((word) => [word[0].toUpperCase(), ...word.substr(1)].join('')).join(' ');

ES 6

str.split(' ')
   .map(s => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase())
   .join(' ')

еще

str.split(' ').map(function (s) {
    return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase();
}).join(' ')

Напоминаем, что, вероятно, должен быть s.slice(0, 1).toUpperCase(), если вы все еще хотите эту первую букву.

WindsofTime 13.11.2016 04:00

@jssridhar вы также должны исправить код в ES6.

caiosm1005 20.12.2016 05:09

Прерывается, если str - одиночный символ

Madbreaks 19.09.2018 21:05

@jssridhar может быть лучше для нас .charAt(0).toUpperCase().

roydukkey 05.10.2018 15:27

дубликат ответа a8m

Thank you 13.11.2018 17:45

Вот моя функция, которая заботится о акцентированных символах (важно для французского!) И может включать / выключать обработку исключений с понижением. Надеюсь, это поможет.

String.prototype.titlecase = function(lang, withLowers = false) {
    var i, string, lowers, uppers;

    string = this.replace(/([^\s:\-'])([^\s:\-']*)/g, function(txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    }).replace(/Mc(.)/g, function(match, next) {
        return 'Mc' + next.toUpperCase();
    });

    if (withLowers) {
        if (lang == 'EN') {
            lowers = ['A', 'An', 'The', 'At', 'By', 'For', 'In', 'Of', 'On', 'To', 'Up', 'And', 'As', 'But', 'Or', 'Nor', 'Not'];
        }
        else {
            lowers = ['Un', 'Une', 'Le', 'La', 'Les', 'Du', 'De', 'Des', 'À', 'Au', 'Aux', 'Par', 'Pour', 'Dans', 'Sur', 'Et', 'Comme', 'Mais', 'Ou', 'Où', 'Ne', 'Ni', 'Pas'];
        }
        for (i = 0; i < lowers.length; i++) {
            string = string.replace(new RegExp('\s' + lowers[i] + '\s', 'g'), function(txt) {
                return txt.toLowerCase();
            });
        }
    }

    uppers = ['Id', 'R&d'];
    for (i = 0; i < uppers.length; i++) {
        string = string.replace(new RegExp('\b' + uppers[i] + '\b', 'g'), uppers[i].toUpperCase());
    }

    return string;
}

Если вы можете использовать в своем коде сторонние библиотеки, то у lodash есть для нас вспомогательная функция.

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

_.startCase('foo bar');
// => 'Foo Bar'

_.startCase('--foo-bar--');
// => 'Foo Bar'
 
_.startCase('fooBar');
// => 'Foo Bar'
 
_.startCase('__FOO_BAR__');
// => 'FOO BAR'

Попробуйте этот кратчайший путь:

str.replace(/(^[a-z])|(\s+[a-z])/g, txt => txt.toUpperCase());

Для тех из нас, кто боится регулярных выражений (смеется):

function titleCase(str)
{
    var words = str.split(" ");
    for ( var i = 0; i < words.length; i++ )
    {
        var j = words[i].charAt(0).toUpperCase();
        words[i] = j + words[i].substr(1);
    }
    return words.join(" ");
}

Это решение учитывает знаки препинания для новых предложений, обрабатывает цитаты, преобразует второстепенные слова в нижний регистр и игнорирует акронимы или слова, начинающиеся с заглавных букв.

var stopWordsArray = new Array("a", "all", "am", "an", "and", "any", "are", "as", "at", "be", "but", "by", "can", "can't", "did", "didn't", "do", "does", "doesn't", "don't", "else", "for", "get", "gets", "go", "got", "had", "has", "he", "he's", "her", "here", "hers", "hi", "him", "his", "how", "i'd", "i'll", "i'm", "i've", "if", "in", "is", "isn't", "it", "it's", "its", "let", "let's", "may", "me", "my", "no", "of", "off", "on", "our", "ours", "she", "so", "than", "that", "that's", "thats", "the", "their", "theirs", "them", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "to", "too", "try", "until", "us", "want", "wants", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "well", "went", "were", "weren't", "what", "what's", "when", "where", "which", "who", "who's", "whose", "why", "will", "with", "won't", "would", "yes", "yet", "you", "you'd", "you'll", "you're", "you've", "your");

// Only significant words are transformed. Handles acronyms and punctuation
String.prototype.toTitleCase = function() {
    var newSentence = true;
    return this.split(/\s+/).map(function(word) {
        if (word == "") { return; }
        var canCapitalise = true;
        // Get the pos of the first alpha char (word might start with " or ')
        var firstAlphaCharPos = word.search(/\w/);
        // Check for uppercase char that is not the first char (might be acronym or all caps)
        if (word.search(/[A-Z]/) > 0) {
            canCapitalise = false;
        } else if (stopWordsArray.indexOf(word) != -1) {
            // Is a stop word and not a new sentence
            word.toLowerCase();
            if (!newSentence) {
                canCapitalise = false;
            }
        }
        // Is this the last word in a sentence?
        newSentence = (word.search(/[\.!\?:]['"]?$/) > 0)? true : false;
        return (canCapitalise)? word.replace(word[firstAlphaCharPos], word[firstAlphaCharPos].toUpperCase()) : word;
    }).join(' ');
}

// Pass a string using dot notation:
alert("A critical examination of Plato's view of the human nature".toTitleCase());
var str = "Ten years on: a study into the effectiveness of NCEA in New Zealand schools";
str.toTitleCase());
str = "\"Where to from here?\" the effectivness of eLearning in childhood education";
alert(str.toTitleCase());

/* Result:
A Critical Examination of Plato's View of the Human Nature.
Ten Years On: A Study Into the Effectiveness of NCEA in New Zealand Schools.
"Where to From Here?" The Effectivness of eLearning in Childhood Education. */

Вот компактное решение проблемы:

function Title_Case(phrase) 
{
  var revised = phrase.charAt(0).toUpperCase();

  for ( var i = 1; i < phrase.length; i++ ) {

    if (phrase.charAt(i - 1) == " ") {
     revised += phrase.charAt(i).toUpperCase(); }
    else {
     revised += phrase.charAt(i).toLowerCase(); }

   }

return revised;
}

Я думаю, что проще всего использовать css.

function format_str(str) {
    str = str.toLowerCase();
    return '<span style = "text-transform: capitalize">'+ str +'</span>';
}

Я обновил код и протестировал его. Теперь он должен работать.

wondim 04.08.2018 19:54

Вы можете использовать CSS только в той части сред, в которой используется JS, поэтому это решение нежизнеспособно. Также следует любой ценой избегать встроенных стилей.

Madbreaks 19.09.2018 21:09

@ Стив, он пройдет toLowerCase()?

wondim 28.08.2020 03:47

Мы обсуждали здесь, в офисе, и думаем, что попытка автоматически исправить способ ввода имен людьми так, как вы хотите, чревата возможными проблемами.

Мы придумали несколько случаев, когда разные типы автоматической капитализации разваливаются. и это только для английских имен, у каждого языка есть свои сложности.

Проблемы с заглавными буквами в каждом имени:

• Запрещается вводить такие сокращения, как IBM, они будут преобразованы в Ibm.

• Имя Макдональд превратилось бы в Макдональд, что неверно, то же самое и с Макдональдсом.

• Двуствольные имена, такие как Мари-Тонкс, превратятся в Мари-Тонкс.

• Такие имена, как О'Коннор, превратятся в О'Коннор.

Для большинства из них вы можете написать собственные правила, чтобы справиться с этим, однако у этого все еще есть проблемы с Acronyms, как и раньше, и вы получаете новую проблему:

• Добавление правила для исправления имен с Mac, например MacDonald, приведет к тому, что имена, такие как Macy, будут прерваны, превратив его в MacY.

Единственное решение, которое мы придумали, которое никогда не бывает неправильным, - это использовать каждую букву с заглавной буквы, что является методом грубой силы, который, похоже, также использует DBS.

Так что, если вы хотите автоматизировать процесс, это практически невозможно без словаря каждого отдельного имени и слова и того, как они должны быть заглавными, Если у вас нет правила, охватывающего все, не используйте его, так как оно просто раздражает ваших пользователей и побуждает людей, которые хотят ввести свои имена правильно, перейти в другое место.

Вы можете проверить, кажется ли, что входная строка уже правильно оформлена, и только в том случае, если она не является (например, все нижние или все верхние), измените регистр своим наилучшим алгоритмом.

dan-man 12.07.2020 21:54

Сначала преобразуйте string в массив с помощью расщепление, пробелами:

var words = str.split(' ');

Затем используйте array.map, чтобы создать новый массив, содержащий слова с заглавной буквы.

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

Затем присоединиться новый массив с пробелами:

capitalized.join(" ");

function titleCase(str) {
  str = str.toLowerCase(); //ensure the HeLlo will become Hello at the end
  var words = str.split(" ");

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

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

ПРИМЕЧАНИЕ:

У этого, конечно, есть недостаток. Это будет использовать только первую букву каждого слова. Словом, это означает, что он обрабатывает каждую строку, разделенную моими пробелами, как 1 слово.

Предположительно у вас есть:

str = "I'm a little/small tea pot";

Это произведет

I'm A Little/small Tea Pot

по сравнению с ожидаемым

I'm A Little/Small Tea Pot

В этом случае использование Regex и .заменять поможет:

с ES6:

const capitalize = str => str.length
  ? str[0].toUpperCase() +
    str.slice(1).toLowerCase()
  : '';

const escape = str => str.replace(/./g, c => `\${c}`);
const titleCase = (sentence, seps = ' _-/') => {
  let wordPattern = new RegExp(`[^${escape(seps)}]+`, 'g');
  
  return sentence.replace(wordPattern, capitalize);
};
console.info( titleCase("I'm a little/small tea pot.") );

или без ES6:

function capitalize(str) {
  return str.charAt(0).toUpperCase() + str.substring(1, str.length).toLowerCase();
}

function titleCase(str) {
  return str.replace(/[^\ /\-\_]+/g, capitalize);
}

console.info(titleCase("I'm a little/small tea pot."));

Я хотел добавить свой собственный ответ, так как мне нужна была надежная функция toTitleCase, которая учитывает правила грамматики перечислено здесь (рекомендованная Google статья). Существуют различные правила, которые зависят от длины входной строки. Ниже представлена ​​функция + юнит-тесты.

Функция также объединяет пробелы и удаляет специальные символы (измените регулярное выражение для ваших нужд)

toTitleCase, функция

const toTitleCase = (str) => {
  const articles = ['a', 'an', 'the'];
  const conjunctions = ['for', 'and', 'nor', 'but', 'or', 'yet', 'so'];
  const prepositions = [
    'with', 'at', 'from', 'into','upon', 'of', 'to', 'in', 'for',
    'on', 'by', 'like', 'over', 'plus', 'but', 'up', 'down', 'off', 'near'
  ];

  // The list of spacial characters can be tweaked here
  const replaceCharsWithSpace = (str) => str.replace(/[^0-9a-z&/\]/gi, ' ').replace(/(\s\s+)/gi, ' ');
  const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase() + str.substr(1);
  const normalizeStr = (str) => str.toLowerCase().trim();
  const shouldCapitalize = (word, fullWordList, posWithinStr) => {
    if ((posWithinStr == 0) || (posWithinStr == fullWordList.length - 1)) {
      return true;
    }

    return !(articles.includes(word) || conjunctions.includes(word) || prepositions.includes(word));
  }

  str = replaceCharsWithSpace(str);
  str = normalizeStr(str);

  let words = str.split(' ');
  if (words.length <= 2) { // Strings less than 3 words long should always have first words capitalized
    words = words.map(w => capitalizeFirstLetter(w));
  }
  else {
    for (let i = 0; i < words.length; i++) {
      words[i] = (shouldCapitalize(words[i], words, i) ? capitalizeFirstLetter(words[i], words, i) : words[i]);
    }
  }

  return words.join(' ');
}

Модульные тесты для проверки правильности

import { expect } from 'chai';
import { toTitleCase } from '../../src/lib/stringHelper';

describe('toTitleCase', () => {
  it('Capitalizes first letter of each word irrespective of articles, conjunctions or prepositions if string is no greater than two words long', function(){
    expect(toTitleCase('the dog')).to.equal('The Dog'); // Capitalize articles when only two words long
    expect(toTitleCase('for all')).to.equal('For All'); // Capitalize conjunctions when only two words long
    expect(toTitleCase('with cats')).to.equal('With Cats'); // Capitalize prepositions when only two words long
  });

  it('Always capitalize first and last words in a string irrespective of articles, conjunctions or prepositions', function(){
    expect(toTitleCase('the beautiful dog')).to.equal('The Beautiful Dog');
    expect(toTitleCase('for all the deadly ninjas, be it so')).to.equal('For All the Deadly Ninjas Be It So');
    expect(toTitleCase('with cats and dogs we are near')).to.equal('With Cats and Dogs We Are Near');
  });

  it('Replace special characters with space', function(){
    expect(toTitleCase('[wolves & lions]: be careful')).to.equal('Wolves & Lions Be Careful');
    expect(toTitleCase('wolves & lions, be careful')).to.equal('Wolves & Lions Be Careful');
  });

  it('Trim whitespace at beginning and end', function(){
    expect(toTitleCase(' mario & Luigi superstar saga ')).to.equal('Mario & Luigi Superstar Saga');
  });

  it('articles, conjunctions and prepositions should not be capitalized in strings of 3+ words', function(){
    expect(toTitleCase('The wolf and the lion: a tale of two like animals')).to.equal('The Wolf and the Lion a Tale of Two like Animals');
    expect(toTitleCase('the  three Musketeers  And plus ')).to.equal('The Three Musketeers and Plus');
  });
});

Обратите внимание, что я удаляю довольно много специальных символов из предоставленных строк. Вам нужно будет настроить регулярное выражение в соответствии с требованиями вашего проекта.

Я предпочитаю это решение, так как оно действительно заботится о регистре заголовков. Это не "Унесенные ветром", это "Унесенные ветром"

russellmania 19.10.2017 01:50

Я предпочитаю следующие ответы другим. Он соответствует только первой букве каждого слова и делает ее заглавной. Более простой код, легче читать и меньше байтов. Он сохраняет существующие заглавные буквы, чтобы предотвратить искажение сокращений. Однако вы всегда можете сначала вызвать toLowerCase() в своей строке.

function title(str) {
  return str.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

Вы можете добавить это в свой строковый прототип, который позволит вам использовать 'my string'.toTitle() следующим образом:

String.prototype.toTitle = function() {
  return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

Пример:

String.prototype.toTitle = function() {
  return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}

console.info('all lower case ->','all lower case'.toTitle());
console.info('ALL UPPER CASE ->','ALL UPPER CASE'.toTitle());
console.info("I'm a little teapot ->","I'm a little teapot".toTitle());

Еще приятнее, как лямбда const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());

0xcaff 04.03.2018 19:15

Я не хотел ломать IE, но да, если приложение не чувствительно к устаревшим браузерам, оно могло быть короче.

Tom Kay 05.03.2018 18:47

Это только частичное решение - op спросил, как преобразовать строку в регистр заголовка. Этот ответ не подходит для таких входов, как NoT qUiITe.

Madbreaks 18.09.2018 20:36

@Madbreaks В вопросе не оговаривается, что необходимо преобразовывать входные данные со смешанным регистром. Однако я обновил ответ, в котором упоминается toLowerCase. Просто имейте в виду, что это приведет к разрыву аббревиатур. an HTML document: An HTML Document против An Html Document

Tom Kay 19.09.2018 13:22

Но «заглавный регистр» имеет значение. Предложение, состоящее только из заглавных букв, не может считаться заглавным регистром, и ваш ответ допускает это. en.wikipedia.org/wiki/Letter_case#Title_case - Мне нравится ваш ответ, но в данном контексте он неполный.

Madbreaks 19.09.2018 17:45

@Madbreaks Хотя ваш первоначальный пример был надуманным, вы хорошо замечаете, что вывод не изменился бы, если бы ввод был написан с заглавной буквы. При этом я считаю, что ответ как есть (с поправкой, предлагающей toLowerCase) более гибкий / полезный, чем тот, который предполагает намерения разработчиков. Этот метод также отражает функциональность аналогичных встроенных методов других языков, таких как PHP (ucwords) и Golang (strings.Title). .NET (TextInfo.ToTitleCase) интересно работает для смешанного случая, но также оставит полностью заглавные строки без изменений.

Tom Kay 19.09.2018 19:16

Спасибо - я не заметил, как вы добавили toLowerCase, который мне подходит. +1, ура

Madbreaks 19.09.2018 20:50

К сожалению, \b не совсем соответствует вашим ожиданиям со словами, содержащими апострофы. title("I'm a little teapot") => "I'M A Little Teapot"

rcoup 26.09.2018 17:23

спасибо за обратную связь @rcoup - если я переключу его на соответствие (пробел или начало строки), можете ли вы подумать о каких-либо проблемах с обратной совместимостью по сравнению с границей?

Tom Kay 26.09.2018 17:32

Предложения @TomKay / запятые / точка с запятой / дефисы будут проблемой.

rcoup 01.10.2018 16:44

Было несколько отличных ответов, но многие люди используют регулярное выражение для поиска слова, но по какой-то причине никто другой не использует регулярное выражение для замены первого символа. Для объяснения я предоставлю длинное решение и более короткое.

Долгое решение (более пояснительное). Используя регулярное выражение [^\s_\-/]*, мы можем найти каждое слово в предложении. Впоследствии мы можем использовать регулярное выражение . для сопоставления с первым символом в слове. Используя версию replace с регулярным выражением для обоих из них, мы можем изменить решение следующим образом:

function toUpperCase(str) { return str.toUpperCase(); }
function capitalizeWord(word) { return word.replace(/./, toUpperCase); }
function capitalize(sentence) { return sentence.toLowerCase().replace(/[^\s_\-/]*/g, capitalizeWord); }

console.info(capitalize("hello world")); // Outputs: Hello World

Для одной функции, которая делает то же самое, мы вкладываем вызовы replace следующим образом:

function capitalize(sentence) {
  return sentence.toLowerCase().replace(/[^\s_\-/]*/g, function (word) {
    return word.replace(/./, function (ch) { return ch.toUpperCase(); } );
  } );
}

console.info(capitalize("hello world")); // Outputs: Hello World

this is a test ---> This Is A Test

function capitalize(str) {

  const word = [];

  for (let char of str.split(' ')) {
    word.push(char[0].toUpperCase() + char.slice(1))
  }

  return word.join(' ');

}

console.info(capitalize("this is a test"));

Использование метода уменьшить

function titleCase(str) {
  const arr = str.split(" ");
  const result = arr.reduce((acc, cur) => {
    const newStr = cur[0].toUpperCase() + cur.slice(1).toLowerCase();
    return acc += `${newStr} `
  },"")
  return result.slice(0, result.length-1);
}

Другой подход к достижению чего-то подобного может заключаться в следующем.

formatName(name) {
    let nam = '';
    name.split(' ').map((word, index) => {
        if (index === 0) {
            nam += word.split('').map((l, i) => i === 0 ? l.toUpperCase() : l.toLowerCase()).join('');
        } else {
            nam += ' ' + word.split('').map(l => l.toLowerCase()).join('');
        }
    });
    return nam;
}

ES-6 way to get title case of a word or entire line.
ex. input = 'hEllo' --> result = 'Hello'
ex. input = 'heLLo woRLd' --> result = 'Hello World'

const getTitleCase = (str) => {
  if (str.toLowerCase().indexOf(' ') > 0) {
    return str.toLowerCase().split(' ').map((word) => {
      return word.replace(word[0], word[0].toUpperCase());
    }).join(' ');
  }
  else {
    return str.slice(0, 1).toUpperCase() + str.slice(1).toLowerCase();
  }
}

вот еще одно решение с использованием css (и javascript, если текст, который вы хотите преобразовать, находится в верхнем регистре):

html

<span id='text'>JOHN SMITH</span>

js

var str = document.getElementById('text').innerHtml;
var return_text = str.toLowerCase();

css

#text{text-transform:capitalize;}

https://lodash.com/docs/4.17.11#capitalize

Используйте библиотеку Lodash .. !! Более надежный

_.capitalize('FRED'); => 'Fred'

Не работает для слов после первого: _.capitalize ('john smith') => 'John smith'. Использование _.VERSION = 4.17.11

Flo 21.03.2019 00:34

Более надежный, но более раздутый.

haykam 21.03.2019 02:43

Поменять его на _.startCase('john smith'); => 'John Smith' будет правильно.

Ecker00 26.03.2019 10:31

@ Ecker00, да, но это ответ существовал в 2016 году.

Michael 28.08.2019 16:02

Джон Смит -> Джон Смит

'john smith'.replace(/(^\w|\s+\w){1}/g, function(str){ return str.toUpperCase() } );

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

Работает для образца и o'henry, но делает странные вещи с horse's mouth.

Michael 24.06.2019 20:46

"john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase()) лучше ?

w3debugger 07.02.2020 01:28

Не хотел редактировать ответ @ Proximo: \b и \S - это специальные классы персонажей, обозначающие «границу слова» и «одиночный непробельный символ. Таким образом, регулярное выражение соответствует каждому символу, следующему за границей слова, и использует этот символ с заглавной буквы, применяя заданную стрелочную функцию.

Jens 28.02.2020 14:14

Мое однострочное решение:

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

Затем вы можете вызвать метод capitalizeWords() для любой строки. Например:

var myS = "this actually works!";
myS.capitalizeWords();

>>> This Actually Works

Мое другое решение:

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

Затем вы можете вызвать метод capitalizeWords() для любой строки. Например:

var myStr = "this one works too!";
myStr.capitalizeWords();

>>> This One Works Too

Альтернативное решение, основанное на ответе Грега Дина:

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

Затем вы можете вызвать метод capitalizeWords() для любой строки. Например:

var myString = "yes and no";
myString.capitalizeWords()

>>> Yes And No

Решение с использованием lodash -

import { words, lowerCase, capitalize, endsWith, padEnd } from 'lodash';
const titleCase = string =>
  padEnd(
    words(string, /[^ ]+/g)
      .map(lowerCase)
      .map(capitalize)
      .join(' '),
    string.length,
  );

почему не _.startCase('john smith');? lodash.com/docs/4.17.15#startCase

w3debugger 07.02.2020 00:59

_.startCase удаляет все специальные символы, которые присутствуют в вашей строке. _.startCase('john-smith') => John Smith. Кроме того, если вся строка в верхнем регистре и если вы хотите, чтобы только первые символы были заглавными, startCase не помогает. _.startCase('JOHN SMITH') => JOHN SMITH

Avinash 10.02.2020 21:24

аааа, не знал о заглавных буквах. а в таком случае мы можем использовать _.startCase('HELLO'.toLowerCase())?

w3debugger 12.02.2020 11:04

Я думаю, вам стоит попробовать эту функцию.

var toTitleCase = function (str) {
    str = str.toLowerCase().split(' ');
    for (var i = 0; i < str.length; i++) {
        str[i] = str[i].charAt(0).toUpperCase() + str[i].slice(1);
    }
    return str.join(' ');
};

Что, если я хочу создать метод toTitleCase(), пригодный для использования так же, как «родной» toLowerCase(): str.toTitleCase()?

Razvan Zamfir 17.09.2020 18:14

Мой список основан на трех быстрых поисках. Один для списка слов, которые не должны начинаться с заглавной буквы, и один для полного списка предлогов.

Один последний поиск сделал предложение, что предлоги 5 или более букв должны быть заглавными, что мне понравилось. Моя цель - неформальное использование. Я оставил «без» в их, потому что это очевидный аналог с.

Таким образом, в нем используются заглавные буквы, первая буква названия и первая буква большинства слов.

Он не предназначен для обработки слов с заглавными буквами. Я хотел оставить их в покое.

function camelCase(str) {
  return str.replace(/((?:^|\.)\w|\b(?!(?:a|amid|an|and|anti|as|at|but|but|by|by|down|for|for|for|from|from|in|into|like|near|nor|of|of|off|on|on|onto|or|over|past|per|plus|save|so|than|the|to|to|up|upon|via|with|without|yet)\b)\w)/g, function(character) {
  return character.toUpperCase();
})}
    
console.info(camelCase('The quick brown fox jumped over the lazy dog, named butter, who was taking a nap outside the u.s. Post Office. The fox jumped so high that NASA saw him on their radar.'));

Что, если я хочу создать метод toTitleCase(), пригодный для использования точно так же, как «родной» toLowerCase(): str.toTitleCase(), как бы вы это сделали?

Razvan Zamfir 17.09.2020 18:14

@RazvanZamfir Вы можете изменить строку prototype. Можно сделать String.prototype.toTitleCase = function() {...}codementor.io/@dhruvkumarjha/…

Regular Jo 18.09.2020 00:03

Простой способ преобразовать отдельное слово в регистр заголовка

Использование метода "Slice" и конкатенации строк

str.slice(0, 1).toUpperCase() + str.slice(1, str.length)

* Добавьте .toLowerCase () в конец, если вы хотите, чтобы остальная часть слова была строчной.

Использование ES6 Spread Operator, Map и Join

[...str].map((w, i) => i === 0 ? w[0].toUpperCase() : w).join('')

Удивлен, что никто не упомянул об использовании параметра rest. Вот простой лайнер, использующий параметры ES6 Rest.

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

ваах пандей джи. Благодарность

Bal Krishna Jha 02.02.2021 19:19

Однострочное выражение с использованием регулярного выражения, получение всех начальных символов \g слов \b[a-zA-Z] и применение .toUpperCase()

const textString = "Convert string to title case with Javascript.";
const converted = textString.replace(/\b[a-zA-Z]/g, (match) => match.toUpperCase());
console.info(converted)

Вот действительно простая и лаконичная функция ES6 для этого:

const titleCase = (str) => {
  return str.replace(/\w\S*/g, (t) => { return t.charAt(0).toUpperCase() + t.substr(1).toLowerCase() });
}

export default titleCase;

Хорошо работает в папке utilities и используется следующим образом:

import titleCase from './utilities/titleCase.js';

const string = 'my title & string';

console.info(titleCase(string)); //-> 'My Title & String'

Я не рекомендовал использовать startCase Lodash, поскольку он удаляет такие символы, как '&'

Hedley Smith 19.11.2020 13:40

Контрольный показатель

TL; DR

Победителем этого теста стал старый добрый цикл 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;
}

Обратите внимание, что я намеренно не менял прототип, так как считаю это действительно плохой практикой, и я не думаю, что мы должны продвигать такую ​​практику в наших ответах. Это нормально только для небольших кодовых баз, когда вы единственный, кто работаете над этим.

Если вы хотите добавить какой-либо другой способ сделать это в этот тест, прокомментируйте, пожалуйста, ссылку на ответ!

Вот мой ответ Ребята прокомментируйте и поставьте лайк, если ваша проблема решена.

function toTitleCase(str) {
  return str.replace(
    /(\w*\W*|\w*)\s*/g,
    function(txt) {
    return(txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase())
    }
  ); 
}
<form>
  Input:
  <br /><textarea name = "input" onchange = "form.output.value=toTitleCase(this.value)" onkeyup = "form.output.value=toTitleCase(this.value)"></textarea>
  <br />Output:
  <br /><textarea name = "output" readonly onclick = "select(this)"></textarea>
</form>

Будьте осторожны со словами со знаками. Например: cördoba отображается как CöRdoba

Silvestre 11.03.2021 03:04

Благодарим за ваше предложение. Я буду обновлять свой ответ, когда получу решение.

Soham Patel 11.03.2021 16:15

Другие вопросы по теме