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