在JavaScript中反转字符串

时间:2009-10-23 04:51:55

标签: javascript jquery string

我正在尝试撤消输入字符串

var oneway = $('#inputfield').val();
var backway = oneway.reverse();

但是萤火虫告诉我oneway.reverse()不是一个功能。有什么想法吗?

谢谢

15 个答案:

答案 0 :(得分:113)

reverse()是一个数组实例的方法。它不会直接用于字符串。您应该首先将字符串的字符拆分为数组,反转数组,然后再连接回字符串:

var backway = oneway.split("").reverse().join("");

<强>更新

上述方法仅适用于“常规”字符串。请参阅以下Mathias Bynens的评论以及his answer的安全反向方法。

答案 1 :(得分:72)

以下技术(或类似技术)通常用于在JavaScript中反转字符串:

// Don’t use this!
var naiveReverse = function(string) {
    return string.split('').reverse().join('');
}

事实上,到目前为止发布的所有答案都是这种模式的变体。但是,此解决方案存在一些问题。例如:

naiveReverse('foo  bar');
// → 'rab �� oof'
// Where did the `` symbol go? Whoops!

如果您想知道为什么会这样,read up on JavaScript’s internal character encoding。 (TL; DR:是星号符号,JavaScript将其公开为两个独立的代码单元。)

但还有更多:

// To see which symbols are being used here, check:
// http://mothereff.in/js-escapes#1ma%C3%B1ana%20man%CC%83ana
naiveReverse('mañana mañana');
// → 'anãnam anañam'
// Wait, so now the tilde is applied to the `a` instead of the `n`? WAT.

测试字符串反向实现的一个好字符串是the following

'foo  bar mañana mañana'

为什么呢?因为它包含星体符号()(represented by surrogate pairs in JavaScript)和组合标记(最后中的mañana实际上由两个符号组成:U + 006E拉丁文小写字母N和U + 0303组合TILDE)。

代理对出现的顺序无法逆转,否则星号符号将不再出现在“反向”字符串中。这就是为什么你在上一个例子的输出中看到那些��标记的原因。

组合标记始终应用于上一个符号,因此您必须将主符号(U + 006E LATIN SMALL LETTER N)作为组合标记(U + 0303 COMBINING TILDE)整体处理。反转它们的顺序将使组合标记与字符串中的另一个符号配对。这就是为什么示例输出有而不是ñ

希望这可以解释为什么到目前为止发布的所有答案都错误


要回答您的初始问题 - 如何[正确]反转JavaScript中的字符串 - ,我编写了一个能够识别Unicode的字符串反转的小型JavaScript库。它没有我刚才提到的任何问题。该库名为Esrever;它的代码在GitHub上,几乎适用于任何JavaScript环境。它带有一个shell实用程序/二进制文件,因此如果需要,您可以轻松地从终端中反转字符串。

var input = 'foo  bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab  oof'

答案 2 :(得分:8)

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

受到the first result的启发,当我为javascript string reverse创建Google时,我获得了启发。

答案 3 :(得分:4)

// You could reverse a string without creating an array

String.prototype.reverse= function(){
 var s= '', L= this.length;
 while(L){
  s+= this[--L];
 }
 return s;
}

var s1= 'the time has come, the walrus said, to speak of many things';
s1.reverse()
/*returned value: (String)
sgniht ynam fo kaeps ot, dias surlaw eht, emoc sah emit eht
*/

答案 4 :(得分:4)

Google更难,兄弟。这是由Edd Mann。

function reverse (s) {
for (var i = s.length - 1, o = ''; i >= 0; o += s[i--]) { }
return o;
}

http://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/

http://jsperf.com/string-reverse-function-performance

答案 5 :(得分:3)

reverse是数组上的函数,它是一个字符串。您可以将字符串分解为数组,然后将其反转,然后将其重新组合在一起。

var str     = '0123456789';
var rev_str = str.split('').reverse().join('');

答案 6 :(得分:1)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script>


        $(document).ready(function () {

            $("#stringInput").keyup(function () {
                debugger;
                var string = $("#stringInput").val();
                var stringArray = [];
                sInput = string.toString();

                for (var i = 0, len = sInput.length; i < len; i++) {

                    stringArray.push(sInput.charAt(i));
                }
                stringArray.reverse();
                str = stringArray.join('');


                document.getElementById("stringOutput").value = str;

            });

            $("button").click(function () {
                debugger;
                $("#myForm").toggle();
            });
        });

    </script>
</head>

<body>

     <div>
        <form name="myForm" id="myForm">

    <table>
        <tr>
            <td>Insert Elements :</td>
            <td><input type="text" name="stringInput" id="stringInput"/></td>

            <td>Output :</td>
            <td><input type="text" id="stringOutput" name="stringOutput" readonly="true" /></td>
        </tr>

    </table>
      </form>
         <button>Show/Hide</button>
    </div>
</body>
</html>

答案 7 :(得分:1)

这可能是所有浏览器都可接受的方式:

function reverse(s) {
  var o = '';
  for (var i = s.length - 1; i >= 0; i--)
    o += s[i];
  return o;
}

称之为魅力:

reverse('your_string');

答案 8 :(得分:0)

我认为你会发现事实上reverse()不是jQuery中的一个函数。顺便说一句,jQuery非常擅长操作你的DOM,但实际上并不是用于字符串操作(虽然你可以自己编写/编写自己的插件)。

我发现在javascript中反转字符串的最佳方法是执行以下操作:

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

发现于:http://www.bytemycode.com/snippets/snippet/400/

我想你会发现,如果你把上面的代码弹到你的代码中,你对.reverse()的调用应该有效:)

答案 9 :(得分:0)

Mathias Bynens,您的代码非常感谢,非常感谢!

我将您的代码转换为函数,这样用户就可以从这里复制它。

谢谢!

//The function reverse a string,  JavaScript’s has internal character encoding so we are
//unable to reverse the string in the "easy ways". For example the TL;DR:  is an astral
//symbol, and JavaScript exposes it as two separate code units.
function ReverseString(string){
    //-
    var regexSymbolWithCombiningMarks = /([\0-\u02FF\u0370-\u1DBF\u1E00-\u20CF\u2100-\uD7FF\uDC00-\uFE1F\uFE30-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF])([\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]+)/g;
    var regexSurrogatePair = /([\uD800-\uDBFF])([\uDC00-\uDFFF])/g;
    //-

    //Step 1: deal with combining marks and astral symbols (surrogate pairs)
    string = string
        //Swap symbols with their combining marks so the combining marks go first
        .replace(regexSymbolWithCombiningMarks, function($0, $1, $2) {
            return reverse($2) + $1;
        })
        // Swap high and low surrogates so the low surrogates go first
        .replace(regexSurrogatePair, '$2$1');

    // Step 2: reverse the code units in the string
    var result = '';
    var index = string.length;
    while (index--) {
        result += string.charAt(index);
    }

    //Return value
    return result;
}

答案 10 :(得分:0)

这个反向原型功能是使用“this”实现的。 如果您看到“this”的日志控制台,它将生成数组,并且它具有length属性。 这样!!!只需使用反向“for-loop”,如代码段所示。

String.prototype.reverse = function () {
    console.log(this);
    var result = "";
    var len = this.length;
    
    for (i = (len-1); i >= 0 ; i--) {
        result += this[i];
    }
    return result;
};

alert("elahnu jaknap".reverse());

答案 11 :(得分:0)

  

使用这个简单的方法来反转其位置

的字符串
 function fun(str){
     var arr1=str.split(' ');
     console.log(arr1);
     var strings='',rever='';
     for(var i=0;i<arr1.length;i++)
     {
        strings=arr1[i].split('');
        rever+=strings.reverse().join('')+' ';  
     }
     console.log(rever.split(' '));
     console.log(rever.trim());
 };
 fun('javascript is fun');

答案 12 :(得分:0)

如果有必要还原字符串,但返回错误的原始值:

function reverseString(s) {
    let valuePrintS;
    try {
        valuePrintS = s.split("").reverse().join("");    
    } catch {
        console.log("s.split is not a function");
        valuePrintS = s;
    } finally {
        console.log(valuePrintS);
    }
}

答案 13 :(得分:0)

使用带有错误处理功能的函数参数反转字符串:

function reverseString(s) 
{
   try
   {
      console.log(s.split("").reverse().join(""));
   }
   catch(e)
   {
      console.log(e.message);
      console.log(s);
   }   
}

答案 14 :(得分:-1)

String.prototype.strReverse = function() {

    var newstring = "";

    for (var s=0; s < this.length; s++) {
        newstring = this.charAt(s) + newstring;
    }

    return newstring;
};