我正在尝试创建一个单词反向器功能,该功能将不使用任何循环就反转字符串中每个单词的字母顺序。
到目前为止,我有这个:
var strFlip = function(str){
splitStr = str.split(" ");{
return;
}
var wordFlip = function reverse(splitStr){
return splitStr.split('').reverse().join('');
};
};
console.log(strFlip("Hello Hannah"));
如果独立于其余代码使用,则wordFlip部分可正确反转单个单词的顺序。但是,整个代码会持续输出
undefined
。我不熟悉Javascript,因此我想我只是没有注意到一个简单的结构性问题。 最佳答案
好的,这部分使函数立即返回,由于它什么也不返回,因此您得到undefined
:
var strFlip = function(str){
splitStr = str.split(" ");{
return; //<-- immediately returns here
}
...
};
我不确定该部分正在尝试执行什么操作,但是要实际执行您想要的操作,可以执行以下操作:
var strFlip = function(str) {
//Since you are using a variable as a reference to a function
//expression/literal, there is no hoisting so you have to
//predefine
var wordFlip = function reverse(splitStr) {
return splitStr.split('').reverse().join('');
};
return str.split(" ").map(wordFlip).join(" ");
}
一种更优雅的方法是放弃
wordFlip
,而仅使用匿名回调map
:var strFlip = function(str) {
return str.split(" ").map(function(word) {
return word.split("").reverse().join("");
}).join(" ");
}
要了解
map
的功能,让我们先来看forEach
,因为map
的工作方式类似。当您使用array.forEach(callback)
时,会为callback
中的每个元素调用array
函数。它等效于以下代码:var array = [1, 2, 3];
for(var i = 0; i < array.length; i++) {
callback(array[i]);
}
本质上,这是一种在数组上迭代并对每个元素执行某些操作的“功能”方式。
map
也可以做到这一点;它也迭代数组,但是将数组的每个元素转换(映射)为其他元素,并返回由映射元素组成的新数组。其他内容由callback
的行为定义。这是一个与上面的示例相似的示例。在这里,我还指定了一个实际的callback
,以便您可以更好地看到该行为:var array = [1, 2, 3];
var squares = [];
function square(num) {
return num * num;
}
for(var i = 0; i < array.length; i++) {
squares[i] = square(array[i]);
}
在这里,
square
与callback
相同,并且每个元素都会被调用。然后使用square
的返回值构造新数组。使用map
,您可以将以上内容重写为:var squares = array.map(function(num) {
return num * num;
});
现在将其应用到解决方案中,您可以看到我们将句子中的每个单词都映射到其反向,然后加入映射数组。