如何在单独的行中打印每个单词。除第一个单词外,每个单词均大写

时间:2019-07-01 18:51:16

标签: javascript string algorithm

我正在尝试创建一个将每个单词打印在新行上的函数。给定的参数是一个字符串,该字符串的第一个单词(即“ 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)
  })
}

4 个答案:

答案 0 :(得分:5)

您可以使用带有[A-Z]前缀的每个大写字母的正则表达式\nreplace

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');