需要帮助来反转一串单词

时间:2018-02-07 17:35:49

标签: javascript arrays algorithm ecmascript-6

当我在函数中传递以下字符串作为参数时,如何获得以下输出?

  • 输入:"Reverse this line"

  • 输出:"esreveR siht enil"

这是我的代码

function reverseWords(string) {
    var wordArray = string.split(" ");
    var resultWordArray = [];
    var requiredSentance;
    wordArray.forEach(word => {
        if (word == " ") {
            var space = " ";
            resultWordArray.push(space);
        } else {
            var SplittedWord = word.split("");
            var reversedWordsLettersArray = [];
            SplittedWord.forEach(letter => {
                reversedWordsLettersArray.unshift(letter);
                var reversedWord = reversedWordsLettersArray.join("");
                resultWordArray.push(reversedWord);
            })
        }
    })
    var resultSentance = resultWordArray.join(" ");
    console.log(resultSentance);
}
reverseWords("Reverse this line");

将其作为输出返回:

"R eR veR eveR reveR sreveR esreveR t ht iht siht l il nil enil"

我在这里缺少什么?

4 个答案:

答案 0 :(得分:10)

您可以将字符串拆分为单词并映射每个单词,将其拆分为字符数组并反转数组,然后将单词连接回单个字符串。像这样:

string.split(' ').map(s => s.split('').reverse().join('')).join(' ')

解释代码:

string.split(' ')

此行将整个字符串拆分为单词数组,"Reverse this line"变为["Reverse", "this", "line"](注意空格已消失)。请记住,双倍空格仍将作为单个空格分割。

由于我们现在有一个数组,你可以使用.map函数迭代整个字符串。它与您尝试使用.forEach的方式类似,区别在于.map函数将返回一个新数组,其中包含修改后的值,这些值在{{1}的每次迭代中返回回调函数。确保返回一些内容,或者值为.map!正如您在上面的示例中所看到的,ES2015 +中的箭头函数具有隐式返回,但如果您使用undefined,则块需要显式=> {...}语句才能生效。

return函数回调的代码

.map

接收一个s => s.split('').reverse().join('') ,它是上面数组中的一个单词,将单词拆分为空字符串,这是将字符串拆分为字符的解决方法。例如,s变为"Reverse"["R", "e", "v", "e", "r", "s", "e"]函数的名称非常具有描述性,它只是反转数组。不过要小心!它会改变数组,所以如果你在随机数组上调用.reverse()函数,它将从该行反转。如果您不小心,这可能会导致一些问题。最后,.reverse()将反转的字符数组放回一个字符串中。

最后,最后的.join('')将映射的数组(现在包含反转的单词)与中间的空格一起放回,类似于.join(' ')将字符数组放回单个数组的方式字。

答案 1 :(得分:6)

具体使用您的代码,您非常接近您想要做的事情。您只需要将reversedWord变量的声明移出forEach循环,在forEach循环内更新,最终将使用整个反转词进行定义。

function reverseWords(string) {

var wordArray = string.split(" ");
var resultWordArray = [];
var requiredSentance;

wordArray.forEach(word => {

  if (word == " ") {
    var space = " ";
    resultWordArray.push(space);

  } else {
    var SplittedWord = word.split("");
    var reversedWordsLettersArray = [];
    var reversedWord; //define variable here 

    SplittedWord.forEach(letter => {
      reversedWordsLettersArray.unshift(letter);
      reversedWord = reversedWordsLettersArray.join("");
    })
    resultWordArray.push(reversedWord); // push it here
  }
})

var resultSentance = resultWordArray.join(" ");
  console.log(resultSentance);
}


reverseWords("Reverse this line");

答案 2 :(得分:1)

这是一个有趣的方法,如果您在框外略微考虑字符串处理,则不需要调用.map()

function reverseWords(string, delimiter = ' ') {
  return string
    .split('').reverse().join('')
    .split(delimiter).reverse().join(delimiter);
}

console.log(reverseWords('Reverse this line'));

如果您在第一次传递时逐个字符地反转,则可以通过单词分隔符(在本例中为' ')拆分字符串并反转单词以将它们按原始顺序放回到第二遍。

对此方法进行基准测试后,我发现it is twice as fast as the currently accepted answer

关于此函数的另一个不错的功能是您可以将单词分隔符指定为可选的第二个参数:

function reverseWords(string, delimiter = ' ') {
  return string
    .split('').reverse().join('')
    .split(delimiter).reverse().join(delimiter);
}

console.log(reverseWords('Reverse	this	line', '\t'));

答案 3 :(得分:1)

这是一个递归方法,只需在字符串上迭代一次:

function reverseWords(string){
  return (function f(str, i, reversed){
    if (!str[i])
      return reversed;

    if (str[i] == ' ')
      return reversed + ' ' + f(str, i + 1, '');

    return f(str, i + 1, str[i] + reversed);
  })(string, 0, '');
}

console.log(reverseWords("Reverse this line"));