我正在尝试创建一个单词反向器功能,该功能将不使用任何循环就反转字符串中每个单词的字母顺序。

到目前为止,我有这个:

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]);
}

在这里,squarecallback相同,并且每个元素都会被调用。然后使用square的返回值构造新数组。使用map,您可以将以上内容重写为:
var squares = array.map(function(num) {
    return num * num;
});

现在将其应用到解决方案中,您可以看到我们将句子中的每个单词都映射到其反向,然后加入映射数组。

10-06 04:14
查看更多