Javascript:Word反向函数未定义?

时间:2015-07-29 17:40:15

标签: javascript function reverse

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

到目前为止,我有这个:

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

5 个答案:

答案 0 :(得分:2)

通过尝试在函数中嵌套函数来使事情过于复杂。创建一个同时执行单词和字符反转工作的单个函数:

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


alert(flipper("Hello Hannah"));

答案 1 :(得分:2)

好吧,这个部分导致函数立即返回,因为它什么也没有返回,你得到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

基本上它是一个功能性的&#34;迭代数组并对每个元素执行某些操作的方法。 callback也这样做;它也遍历数组,但(映射)数组的每个元素转换为其他,并返回一个 new 数组,其中包含映射元素。 其他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

此处,callbacksquare相同,并为每个元素调用它。然后使用map的返回值来构造新数组。使用var squares = array.map(function(num) { return num * num; }); ,您可以将上述内容重写为:

:contains()

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

答案 2 :(得分:2)

你非常接近,但代码有点过分。试试这个:

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

答案 3 :(得分:0)

一种方法是split句子为空格,然后reversejoin空格split再用空格reverse和{{} 1}}空格。

如果你那样做:

join将转换为"Hello Hannah"

答案 4 :(得分:0)

编辑您可以将原型定义为字符串作为一个行解决方案的扩展。

&#13;
&#13;
        <!-- Added for Parse push notifications -->

        <service android:name="com.parse.PushService" />
        <receiver
            android:name=".receiver.CustomPushReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
                <action android:name="com.parse.push.intent.RECEIVE" />
                <action android:name="com.parse.push.intent.DELETE" />
                <action android:name="com.parse.push.intent.OPEN" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="com.parse.GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="com.parse.starter" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.parse.ParseBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>   
&#13;
&#13;
&#13;