获取字符串并反转某些单词——Javascript

获取字符串并反转某些单词——Javascript,javascript,arrays,string,Javascript,Arrays,String,编写一个函数,该函数接受由一个或多个单词组成的字符串,并返回相同的字符串,但所有五个或更多字母单词都颠倒。传入的字符串将仅由字母和空格组成。只有存在多个单词时,才会包含空格 我编写的代码反转了整个字符串。我相信这是if语句的一部分,它不能捕捉大于5的单词。在编写代码时,我的想法是首先将字符串转换为单词数组,使用for循环遍历数组,找到大于5的单词,然后反转大于5的单词。我发现了类似的问题,这就是我寻求帮助的程度。我被卡住了,任何帮助都将不胜感激!我不熟悉编写和学习Javascript funct

编写一个函数,该函数接受由一个或多个单词组成的字符串,并返回相同的字符串,但所有五个或更多字母单词都颠倒。传入的字符串将仅由字母和空格组成。只有存在多个单词时,才会包含空格

我编写的代码反转了整个字符串。我相信这是if语句的一部分,它不能捕捉大于5的单词。在编写代码时,我的想法是首先将字符串转换为单词数组,使用for循环遍历数组,找到大于5的单词,然后反转大于5的单词。我发现了类似的问题,这就是我寻求帮助的程度。我被卡住了,任何帮助都将不胜感激!我不熟悉编写和学习Javascript

function spinWords(backward){

 var sentence = "";
 var separate = backward.split("");

 for (var i = separate.length - 1; i >= 0; i--){
   if (separate[i].length >= 1){
   sentence += separate[i].split("").reverse().join("");
   }
  else {
  sentence += "" + separate[i];
  }
 }
return sentence;
}

spinWords("Hey fellow warriors");

如果使用正则表达式匹配一行中的5个或5个以上单词字符,并使用替换函数来反转这些字符,则逻辑可能会简单得多:

函数自旋字(向后){
返回backward.replace(/\w{5,}/g,word=>word.split(“”).reverse().join(“”));
}

log(spinWords(“嘿,勇士们”)
如果使用正则表达式匹配一行中的5个或5个以上单词字符,并使用替换函数
反转这些字符,您可能会发现逻辑更加容易:

函数自旋字(向后){
返回backward.replace(/\w{5,}/g,word=>word.split(“”).reverse().join(“”));
}

log(spinWords(“嘿,勇士们”)下面是关于解决此问题的可能方法的讨论。对于这么简单的问题,我可能不会这么做,但它展示了一种思维方式,使解决许多问题变得更容易,并在这样做时重用您的工作


解决问题 您需要在这里做几件事,因此将问题分解为多个步骤可能会有所帮助

在核心部分,您希望反转某些单词。那么为什么不编写一个函数来实现这一点呢?它应该很简单。以下是一个版本:

const reverseWord = word => word.split('').reverse().join('')
reverseWord('word') //=> 'drow'
但你只想对长度至少为5的单词这样做。我们可以使用它来编写更复杂的函数,而不是重写现有函数:

const reverseIfGte5 = word => word.length >= 5 ? reverseWord(word) : word
reverseIfGte5('word') //=> 'word'
reverseIfGte5('supercalifragilisticexpialidocious')
//=> 'suoicodilaipxecitsiligarfilacrepus')
注意,在这里,我们使用
reverseeword
编写
reverseIfGte5
。因此,如果我们愿意,我们的
reverseWord
函数也可以重用,但也可以让每个函数都做一些简单的事情

我们现在可以通过

const spinWords = sentence => sentence.split(/\s+/).map(reverseIfGte5).join(' ')

spinWords('Hey fellow warriors') //=> 'Hey wollef sroirraw'
这是意料之中的事。这可能是一个停下来的好地方。然而

每个函数只做一件事 我们上面的
spinWords
函数负责两件事:

  • 找出句子中的单词
  • 将我们的反转功能应用于每个
理想情况下,函数应该只负责一件事。(当然,在决定这些责任如何分解时需要做出一些判断。)

将其分开可能是有用的。我们可以用不同的方式做到这一点。这里有一个简单的例子:

const updateWords = wordFn => sentence => sentence.split(/\s+/).map(wordFn).join(' ')
const spinWords = updateWords(reverseIfGte5)
现在我们有了一个可重用的函数,例如,我们可以使用一个明显的
capitalizeFirstLetter
函数,如下所示:

const titleCase = updateWords(capitalizeFirstLetter)
titleCase('Hey fellow warriors') //=> 'Hey Fellow Warriors')
const updateWords = wordFn => sentence => sentence.split(/\s+/).map(wordFn).join(' ')
const reverseWord = word => word.split('').reverse().join('')
const reverseIfGte5 = word => word.length >= 5 ? reverseWord(word) : word
const spinWords = updateWords(reverseIfGte5)
const updateWords = wordFn => sentence => sentence.replace(/\w+/g, wordFn)
修复bug 我们的代码现在如下所示:

const titleCase = updateWords(capitalizeFirstLetter)
titleCase('Hey fellow warriors') //=> 'Hey Fellow Warriors')
const updateWords = wordFn => sentence => sentence.split(/\s+/).map(wordFn).join(' ')
const reverseWord = word => word.split('').reverse().join('')
const reverseIfGte5 = word => word.length >= 5 ? reverseWord(word) : word
const spinWords = updateWords(reverseIfGte5)
const updateWords = wordFn => sentence => sentence.replace(/\w+/g, wordFn)
这些函数从最有可能重用到最不可能重用的顺序排列

请注意,在使用此类可重用函数时,此处的总代码比此普通版本稍长:

const spinWords = sentence => sentence.split(/\s+/).map(
  word => word.length >= 5 ? word.split('').reverse().join('') : word
).join(' ')
但我们的版本有几个优点。显然,可重用性是其中之一。但另一个问题是,当问题被分解成小块时,如果我们发现了问题,我们就知道在哪里寻找解决方案

猜猜看,这个解决方案实际上有一个潜在的bug

如果我们用
'Hey collow warts'
调用此函数,我们将返回
'Hey wollef oirraw'
,而不是预期的
'Hey wollef sroirraw'
。我们的间隔被切断了

因为这个问题被分解成不同的函数,所以毫无疑问我们需要更改哪个函数来解决这个问题。显然,它是负责分解和重新组合句子的函数,
updateWords
。有一个简单的解决方法,从

const updateWords = wordFn => sentence => sentence.split(/\s+/).map(wordFn).join(' ')

但我们最好使用来自CertainPerformance的答案变体,并将其改写如下:

const titleCase = updateWords(capitalizeFirstLetter)
titleCase('Hey fellow warriors') //=> 'Hey Fellow Warriors')
const updateWords = wordFn => sentence => sentence.split(/\s+/).map(wordFn).join(' ')
const reverseWord = word => word.split('').reverse().join('')
const reverseIfGte5 = word => word.length >= 5 ? reverseWord(word) : word
const spinWords = updateWords(reverseIfGte5)
const updateWords = wordFn => sentence => sentence.replace(/\w+/g, wordFn)
这修复了这个bug,并且实际处理的案例比我们原来可以处理的要多。(请注意,它现在还处理标点符号):

重要的一点是,为了修复我们的bug,我们能够隔离负责的函数,并在不更改任何其他内容的情况下对其进行更改

工作代码 这就是我们达成的目标:

const updateWords=wordFn=>句子=>句子。替换(/\w+//g,wordFn)
const reverseWord=word=>word.split(“”).reverse().join(“”)
const reverseIfGte5=word=>word.length>=5?反向沃德(单词):单词
常量spinWords=updateWords(反向fgte5)

log(spinWords(‘嘿,勇士们!’)
下面讨论了解决此问题的可能方法。对于这么简单的问题,我可能不会这么做,但它展示了一种思维方式,使解决许多问题变得更容易,并在这样做时重用您的工作


解决问题 您需要在这里做几件事,因此将问题分解为多个步骤可能会有所帮助

在核心部分,您希望反转某些单词。那么为什么不编写一个函数来实现这一点呢?它应该很简单。以下是一个版本:

const reverseWord = word => word.split('').reverse().join('')
reverseWord('word') //=> 'drow'
但你只想对长度至少为5的单词这样做。我们可以使用它来编写更复杂的函数,而不是重写现有函数:

const reverseIfGte5 = word => word.length >= 5 ? reverseWord(word) : word
reverseIfGte5('word') //=> 'word'
reverseIfGte5('supercalifragilisticexpialidocious')
//=> 'suoicodilaipxecitsiligarfilacrepus')
注意,在这里,我们使用
reverseeword
编写
reverseIfGte5
。所以我们的
reverseeword