Javascript: 未定义单词反转功能?

Javascript: Word reverse function undefined?

我正在尝试创建一个单词反转器函数,它将反转字符串中每个单词的字母顺序,而不使用任何循环。

到目前为止我有这个:

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,所以我假设我只是没有注意到一个简单的结构问题。

一种方法是 split 空 spaces 的句子,然后 reversejoin 空 spaces split通过 space 然后 reversejoin 以及空的 space.

如果你这样做的话:

"Hello Hannah" 将转换为 "olleH hannaH"

编辑: 您可以将原型定义为字符串作为您自己对单行解决方案的扩展。

String.prototype.Flip = function() {
    return this.split("").reverse().join("").split(" ").reverse().join(" ");
};

var a="Hello Hannah";
alert(a.Flip());

你试图将一个函数嵌套在一个函数中,这让事情变得过于复杂。创建一个单独的函数来完成反转单词和字符的工作:

var flipper = function reverse(splitStr) {
  return splitStr.split('').reverse().join('').split(' ').reverse().join(' ');
};


alert(flipper("Hello Hannah"));

好吧,这部分会导致函数立即 return,因为它什么都没有 return,所以你得到 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) 时,array 中的每个元素都会调用函数 callback。相当于下面的代码:

var array = [1, 2, 3];
for(var i = 0; i < array.length; i++) {
    callback(array[i]);
}

本质上,它是一种 "functional" 遍历数组并对每个元素执行某些操作的方法。 map 也这样做;它也遍历数组,但是将数组的每个元素(映射)到其他和returns a new 由映射元素组成的数组。 其他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 的 return 值来构造新数组。使用 map,您可以将上面的内容重写为:

var squares = array.map(function(num) {
    return num * num;
});

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

你很接近,但代码有点多了。试试这个:

function reverse(splitStr) {
    return splitStr.split('').reverse().join('');
}

console.log(reverse('Hello Hannah'));

我刚刚从您的代码中删除了主要的主力并简化了功能。你走在正确的轨道上,

编辑

如果你想像 Vivin 所建议的那样,让文字保持原样,你可以这样做:

function reverse(splitStr) {
    var strs = splitStr.split(' ');

    var reverseInPlace = [];

    for (var i = 0; i < strs.length; i++) {
        reverseInPlace.push(strs[i].split('').reverse().join(''));
    }

    return reverseInPlace.join(' ');
}

console.log(reverse('Hello Hannah'));