我正在尝试创建一个将每个单词打印在新行上的函数。给定的参数是一个字符串,该字符串的第一个单词(即“ 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)
})
}
答案 0 :(得分:5)
您可以使用带有[A-Z]
前缀的每个大写字母的正则表达式\n
和replace
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))
答案 1 :(得分:1)
我将把单词分解成一个数组并将该数组打印成两个不同的函数。正则表达式使第一部分比您的reduce
调用容易得多。 (但是,如果您没有看到正则表达式解决方案,那是一个reduce
的好主意。)
我的版本可能看起来像这样:
const separateWords = (str) => str .replace (/([A-Z])/g, " $1") .split (' ')
const printSeparateWords = (str) => separateWords (str) .forEach (word => console.log (word) )
printSeparateWords ("helloMyNameIsMark")
答案 2 :(得分:1)
与adiga的答案非常相似,但实际上可以更简单:
<ag-grid-angular
...
[suppressMenuHide]="true">
</ag-grid-angular>
这也将受益于改进的性能(如果大规模使用则可能会很重要)。
答案 3 :(得分:1)
以下是对您所说的要求的更直观的解释:在新行上打印每个单词。
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');