Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   строка, изменить регистр заглавных букв всех слов (https://javascript.ru/forum/misc/77064-stroka-izmenit-registr-zaglavnykh-bukv-vsekh-slov.html)

fluorke 21.03.2019 10:29

строка, изменить регистр заглавных букв всех слов
 
Добрейшего денечка уважаемые. У нас есть строка аля "Вася петя маша таня", между слов пробелы, нужно сделать буквы имен заглавными, при помощи toUpperCase(), indexOf() и for/while. Другими методами пользоваться нельзя. Без массивов.

Индексы пробелов я нашел по шаблону с учебника:

var str = "Ослик Иа-Иа посмотрел на виадук"; // ищем в этой строке
var target = "Иа"; // цель поиска

var pos = 0;
while (true) {
  var foundPos = str.indexOf(target, pos);
  if (foundPos == -1) break;

  alert( foundPos ); // нашли на этой позиции
  pos = foundPos + 1; // продолжить поиск со следующей
}


Дальше я пытаюсь как то манипулировать newStroke = str.slice(...) + str[foundPos].toUpperCase() - не получается.

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

Nexus 21.03.2019 11:04

Цитата:

Сообщение от fluorke
нужно сделать буквы имен

Нужно сделать все имена с заглавных букв или вообще все слова?

Если второе, то я бы сделал так:
function func(string) {
    let position;
    const result = string.split('');
    while ((position = string.indexOf(' ', position + 1)) >= 0)
        result.splice(++position, 1, result[position--].toUpperCase());

    return result.join('');
};

alert(
    func('Вася петя маша таня')
);

fluorke 21.03.2019 11:10

Все первые буквы, всех слов - заглавными, массивами мы не пользуемся, просто цикл и строка. Спасибо.

Nexus 21.03.2019 11:29

fluorke,
function func(string) {
    let position = -1;
    do {
        const before = string.substring(0, position + 1); //with space
        const needle = string.substr(position + 1, 1);
        const after = string.substring(position + 2);

        string = before + needle.toUpperCase() + after;
    } while ((position = string.indexOf(' ', position + 1)) >= 0);

    return string;
};

alert(
    func('вася петя маша таня')
);

Dilettante_Pro 21.03.2019 11:36

при помощи toUpperCase(), indexOf() и for/while. Другими методами пользоваться нельзя
var str = "Вася петя маша таня";
var strNew = "";
var pos = 0;
while(pos < str.length) {
    var foundPos = str.indexOf(" ", pos);
    if (foundPos == -1) break;
    for(var i = pos; i <= foundPos;i++) {
         strNew = strNew + str[i]
    }
    pos = foundPos + 1;
    strNew = strNew + str[pos].toUpperCase();
    pos++;
}
for(var i = pos; i < str.length;i++) {
         strNew = strNew + str[i]
}
alert(strNew);

Malleys 21.03.2019 12:03

function* func(string) {
	var prev = " ";
	for(const char of string)
		yield prev = prev === " " ? char.toUpperCase() : char;
}

alert([...func("вася петя маша таня")].join(""));

рони 21.03.2019 12:03

:-?
var str = "Вася петя маша таня";
var strNew = "";
var up = true;
for(var i = 0; i < str.length;i++) {
         strNew += up ? str[i].toUpperCase() : str[i];
         up = str[i] == " ";
}
alert(strNew);

fluorke 21.03.2019 12:58

Спасибо всем за решения. Меня хватило на такое:
var str = "вася петя маша таня";
n = str[0].toUpperCase()
x = 1

while (x < str.length){
  if (str[x] == ' '){
    n += str[x] + str[x+1].toUpperCase()
    x+=2
  } else {
    n += str[x]
    x++
  }
}
alert(n)

Dilettante_Pro 21.03.2019 14:19

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


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