Javascript 需要帮助反转一串单词吗

Javascript 需要帮助反转一串单词吗,javascript,arrays,algorithm,ecmascript-6,Javascript,Arrays,Algorithm,Ecmascript 6,当我将下面的字符串作为参数传递到函数中时,如何获得下面的输出 输入:“反转此行” 输出:“esreveR siht enil” 这是我的密码 将其作为输出返回: "R eR veR eveR reveR sreveR esreveR t ht iht siht l il nil enil" 这里我遗漏了什么?您可以将字符串拆分为单词并映射每个单词,将其拆分为字符数组并反转数组,然后将单词合并回单个字符串。像这样: string.split(' ').map(s => s.split(

当我将下面的字符串作为参数传递到函数中时,如何获得下面的输出

  • 输入:
    “反转此行”

  • 输出:
    “esreveR siht enil”

这是我的密码 将其作为输出返回:

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

这里我遗漏了什么?

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

string.split(' ').map(s => s.split('').reverse().join('')).join(' ')
要解释代码:

string.split(' ')
此行将整个字符串拆分为一个单词数组,
“反转此行”
将变成
[“反转”、“此”、“行”]
(请注意空格已消失)。请记住,双空间仍将分割为单个空间

由于我们现在有了一个数组,您可以使用
.map
函数迭代整个字符串。它的工作原理与您尝试使用
.forEach
的方式类似,不同之处在于
.map
函数将返回一个新数组,其中包含在
.map
回调函数的每次迭代中返回的修改值。确保返回一些内容,否则值将
未定义
!ES2015+中的箭头函数具有隐式返回,如上面的示例所示,但如果要使用
=>{…}
,则块需要显式
return
语句才能工作

.map
函数回调的代码

s => s.split('').reverse().join('')
接收一个
s
,它是上面数组中的一个单词,将单词按空字符串拆分,这是将字符串拆分为字符的一种解决方法。例如,
“反向”
变成
[“R”、“e”、“v”、“e”、“R”、“s”、“e”]
.reverse()
函数的名称非常具有描述性,它只是反转数组。但是要小心!它会改变数组,因此如果对随机数组调用
.reverse()
函数,它将从该行开始反转。如果不小心,这可能会导致一些问题。最后,
.join(“”)
将反转的字符数组放回到单个字符串字中


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

特别是使用您的代码,您可以非常接近您要做的事情。您只需将
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");

这里有一个有趣的方法,它不需要调用
.map()

函数reverseWords(字符串,分隔符=“”){
返回字符串
.split(“”).reverse().join(“”)
.split(分隔符).reverse().join(分隔符);
}

log(reverseWords('Reverse this line')这里有一个递归方法,只在字符串上迭代一次:

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

您缺少已经存在的事实:
函数reverseWords(string){return string.split('').map(word=>Array.from(word.reverse().join('').join('');}
您可以使用regex:
str.match(/./g).reverse().join('')
@Pedro,如果有两个连续的空格,就会抛出错误。@PatrickRoberts这是怎么回事?它似乎对我有用。我使用的是Chrome版本63。@Pedro这与您的测试类似吗<代码>“反转此行”。拆分(“”).map(s=>s.match(//g).Reverse().join(“”)).join(“”)
@Pedro此操作不正确。再仔细看看预期的输出。OP想要还原每个单词,而不是整个字符串。为什么可能不想使用
.map
?我没有说这是件坏事,我只是通过强调方法的根本不同,将我的答案与当前答案区分开来。但是为了回答您的问题,
.map()
确实会为每个单词增加上下文切换的开销,而实际上并没有。我将进行基准测试并找出哪一个更快,因为在开销方面,两次传球可能仍然比一次传球慢。我很欣赏这一努力,但我看到的唯一一件事是使用
.split
+
.reverse
+
.join
,在我看来,这最终会导致代码不易理解。唯一真正的好处是可自定义的
分隔符
,如果此代码用于比问题中描述的更多不同的情况,这可能会更好。@MarkoGrešak我的假设是正确的,请检查。在可读性和性能之间通常存在权衡。这里的目标很简单。这个函数的用例可能不会出现在需要极高性能的代码库中,它看起来不像是这样的问题。可能是这样,但在知道代码的某些部分的性能是问题之前,我认为对可读性的性能优化是一个非参数。
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"));