Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Первая буква каждого слова заглавная (https://javascript.ru/forum/misc/83980-pervaya-bukva-kazhdogo-slova-zaglavnaya.html)

aMacio 04.05.2022 21:51

Первая буква каждого слова заглавная
 
Добрый день! Совсем недавно начал изучать JS.
У меня есть такая задача:
Необходимо, чтобы каждое слово во фразе начиналось с заглавной буквы.

Данную задачу решил таким способом:
const str1 = "доброго";
const str2 = "дня";
const str3 = "уважаемый"

console.log(`${str1.charAt(0).toUpperCase() + str1.substring(1)} ${str2.charAt(0).toUpperCase() + str2.substring(1)}, ${str3.charAt(0).toUpperCase() + str3.substring(1)}!`)

В целом - все получилось.
Но. Мне предложили данную задачу решить решить через indexOf и substring. Но не знаю как ...
На входе строка идет целиком, а не по отдельности, как сделал я выше.

ksa 04.05.2022 23:13

Цитата:

Сообщение от aMacio
Но. Мне предложили данную задачу решить решить через indexOf и substring. Но не знаю как ...
На входе строка идет целиком, а не по отдельности, как сделал я выше.

Как вариант, с помощью indexOf() искать пробел, с некой "текущей позиции"... Потом брать следующий символ, переводить его в верхний регистр и записывать вместо считанного.
Потом смещать "текущую позицию" и повторять действия пока еще есть пробелы.
Как пробелы закончатся - показывать что получилось.

рони 04.05.2022 23:52

aMacio,
при условии одиночного пробела между словами...
<body>
<script>
const str1 = "доброго";
const str2 = "дня";
const str3 = "уважаемый";
let txt = [str1, str2, str3].join(" ");
let i = -1;
do {
   txt = txt.substring(0, ++i) + txt.substring(i, ++i).toUpperCase() + txt.substring(i);
   i = txt.indexOf(" ", i);
}
while ( i != -1 );
document.body.append(txt);
  </script>
</body>

micscr 05.05.2022 08:29

Я б так сделал:

let phrase = 'слово1   еще   что-то я'
console.log(phrase);
let res = transform(phrase);
console.log(res);

function transform(str) {
	let arr = str.split(' ').map((item) => item ? item.charAt(0).toUpperCase() + item.substring(1) : item);
	return arr.join(' ');
}

рони 05.05.2022 09:49

Цитата:

Сообщение от micscr
Я б так сделал:

Цитата:

Сообщение от aMacio
решить через indexOf и substring.

:-?

micscr 07.05.2022 18:15

зачем делать как кто то предложил?, это что тест?, особенно если предложили слегка не лучшее

rragegfffa 30.05.2022 18:09

Разнообразия ради

// Только латиница
const capitalizeWords = str => str.replace(/\b[a-z]/g, m => m.toUpperCase()) 

// Любые символы из категории "буквы" (в т.ч. вся кириллица), строки типа "кто-то" => "Кто-То"
const capitalizeWords = str => str.replace(/(?<=\P{L}|^)\p{Ll}/gu, m => m.toUpperCase())

TAPAKAH 23.10.2023 17:37

Цитата:

Сообщение от rragegfffa (Сообщение 545726)
Разнообразия ради

// Только латиница
const capitalizeWords = str => str.replace(/\b[a-z]/g, m => m.toUpperCase()) 

// Любые символы из категории "буквы" (в т.ч. вся кириллица), строки типа "кто-то" => "Кто-То"
const capitalizeWords = str => str.replace(/(?<=\P{L}|^)\p{Ll}/gu, m => m.toUpperCase())

Выдает ошибку: Unsupported RegExp flag: u

voraa 23.10.2023 17:57

Цитата:

Сообщение от TAPAKAH
Выдает ошибку: Unsupported RegExp flag: u

Какой браузер, какая версия?

ruslan_mart 23.10.2023 18:05

Короткое решение через регулярку:

function toCapizalize(value) {
  return value.replace(/(^|\s)(.)/g, (_, a, b) => a + b.toUpperCase());
}

console.log(toCapizalize('доброго дня уважаемый'));


Простое и быстрое решение через цикл:
function toCapizalize(value) {
  let finalValue = '';
  let prevChar = ' ';
  
  for (let i = 0; i !== value.length; i++) {
    const char = value[i];
    
    if (prevChar === ' ') {
    	finalValue += char.toUpperCase();
    } else {
    	finalValue += char;
    }
    
    prevChar = char;
  }
  
  return finalValue;
}

console.log(toCapizalize('доброго дня уважаемый'));



Еще можно так поизвращаться:

function toCapizalize(value) {
  const fragments = value.split(/(?:^|\s)(.)/)
    .map((item, index) => index % 2 !== 0 ? ' ' + item.toUpperCase() : item);
  return fragments.join('').trim();
}

console.log(toCapizalize('доброго дня уважаемый'));


Часовой пояс GMT +3, время: 06:03.