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