如何在单独的行中打印每个单词。除第一个单词外,每个单词都大写
Posted
技术标签:
【中文标题】如何在单独的行中打印每个单词。除第一个单词外,每个单词都大写【英文标题】:How to print each word in a separate line. Each word is capitalized except the first 【发布时间】:2019-07-01 18:51:16 【问题描述】:我正在尝试创建一个在新行上打印每个单词的函数。给出的参数是一个字符串,其中的单词不是用空格分隔,而是大写,除了第一个单词,即“helloMyNameIsMark”。我有一些可行的方法,但想知道在 javascript 中是否有更好的方法。
separateWords = (string) =>
const letters = string.split('');
let word = "";
const words = letters.reduce((acc, letter, idx) =>
if (letter === letter.toUpperCase())
acc.push(word);
word = "";
word = word.concat(letter);
else if (idx === letters.length - 1)
word = word.concat(letter);
acc.push(word);
else
word = word.concat(letter)
return acc
, []);
words.forEach(word =>
console.log(word)
)
【问题讨论】:
【参考方案1】:您可以使用正则表达式 [A-Z]
和 replace
每个大写字母加上 \n
前缀
const separateWords = str => str.replace(/[A-Z]/g, m => '\n' + m)
console.log(separateWords('helloMyNameIsMark'))
或者您可以在每个大写字母处使用(?=[A-Z])
到split
的前瞻来获取单词数组。然后循环遍历数组来记录每个单词:
const separateWords = str => str.split(/(?=[A-Z])/g)
separateWords('helloMyNameIsMark').forEach(w => console.log(w))
【讨论】:
【参考方案2】:我会将单词分解成一个数组并将该数组的打印分成两个不同的函数。正则表达式使第一部分比您的reduce
调用更容易。 (但如果您没有看到正则表达式解决方案,reduce
是个好主意。)
我的版本可能如下所示:
const separateWords = (str) => str .replace (/([A-Z])/g, " $1") .split (' ')
const printSeparateWords = (str) => separateWords (str) .forEach (word => console.log (word) )
printSeparateWords ("helloMyNameIsMark")
【讨论】:
【参考方案3】:与阿迪加的答案非常相似,但实际上可以更简单:
const separateWords = str => str.replace(/[A-Z]/g, '\n$&');
这也将受益于改进的性能(如果大规模使用可能很重要)。
【讨论】:
【参考方案4】:这是对您声明的要求的更字面解释:打印每个单词换行。
function separateWords(str)
let currentWord = '';
for (let chr of str)
if (chr == chr.toUpperCase())
console.log(currentWord);
currentWord = chr;
else
currentWord += chr;
if (currentWord)
console.log(currentWord);
separateWords('helloMyNameIsMark');
【讨论】:
以上是关于如何在单独的行中打印每个单词。除第一个单词外,每个单词都大写的主要内容,如果未能解决你的问题,请参考以下文章