split () работает по-разному с более чем одним пробелом - PullRequest
0 голосов
/ 06 мая 2018

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

var S = 'hello world';
var x = S.toLowerCase().split(' ').map(word => word[0].toUpperCase() + word.substr(1)).join(' ');

console.log(x);

НО:

Если строка содержит более одного пробела, как показано ниже, я получаю сообщение об ошибке Cannot read property 'toUpperCase' of undefined.

var S = 'hello   world';
var x = S.toLowerCase().split(' ').map(word => word[0].toUpperCase() + word.substr(1)).join(' ');

console.log(x);

Я попытался добавить + к .split ('') и .join (''), как рекомендовано в прошлых потоках stackoverflow, как показано ниже, но при этом вместо этого использовалась только первая буква первого слова:

var S = 'hello    world';
var x = S.toLowerCase().split(' +').map(word => word[0].toUpperCase() + word.substr(1)).join(' +');

console.log(x); // returns 'Hello    world'

Что было бы правильным для этого?

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Сначала вы должны удалить повторяющиеся пробелы с помощью регулярного выражения.

var S = 'hello    world';
var x = S.replace(/  +/g, ' ').toLowerCase().split(' ').map(word => word[0].toUpperCase() + word.substr(1)).join(' ');

Но если вы хотите сохранить эти пробелы, вы можете использовать

var S = 'hello    world';
var x = S.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1);});
0 голосов
/ 06 мая 2018

Ошибка, которую вы получаете, заключается в том, что вы получаете доступ к первому символу пустой строки, следующий результат дает тот же результат:

word = ''
word[0].toUppercase() ...

вы должны обработать случай, когда строка пуста

word === '' ? word : word[0].toUppercase() ...
0 голосов
/ 06 мая 2018

Вы можете использовать String.replace() с RegExp, чтобы заменить только 1-й символ каждого слова на заглавную версию:

var S = 'hello   world';
var x = S.toLowerCase().replace(/\b\w/g, (m) => m.toUpperCase());

console.log(x);

Если вы все еще хотите использовать String.split(), используйте RegExp и разделите массив на \s+ (последовательность пробелов - пробел, табуляция и т. Д.):

var S = 'hello   world';
var x = S.toLowerCase().split(/\s+/).map(word => word[0].toUpperCase() + word.substr(1)).join(' ');

console.log(x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...