wake-up-neo.net

String in JavaScript umkehren

Ich versuche, eine Eingabezeichenfolge umzukehren

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

aber firebug sagt mir, dass oneway.reverse() keine Funktion ist. Irgendwelche Ideen?

Vielen Dank

47
drummer

reverse() ist eine Methode von Arrayinstanzen. Es funktioniert nicht direkt an einer Zeichenfolge. Sie sollten zuerst die Zeichen des Strings in ein Array aufteilen, das Array umkehren und dann wieder zu einem String zusammenfügen:

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

Update

Die obige Methode ist nur für "normale" Strings sicher. Siehe dazu den Kommentar von Mathias Bynens und auch seine Antwort für eine sichere umgekehrte Methode.

112
Ates Goral

Die folgende (oder ähnliche) Technik wird häufig zum Umkehren einer Zeichenfolge in JavaScript verwendet:

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

Tatsächlich sind alle bisher veröffentlichten Antworten eine Variation dieses Musters. Es gibt jedoch einige Probleme mit dieser Lösung. Zum Beispiel:

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

Wenn Sie sich fragen, warum dies passiert, lesen Sie die interne Zeichencodierung von JavaScript . (TL; DR: ???? ist ein Astralsymbol, und JavaScript macht es als zwei separate Codeeinheiten verfügbar.)

Aber es gibt noch mehr:

// 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.

Eine gute Zeichenfolge zum Testen von umgekehrten Implementierungen von Zeichenfolgen ist die folgenden :

'foo ???? bar mañana mañana'

Warum? Weil es ein astrales Symbol (????) (das durch Ersatzzeichenpaare in JavaScript dargestellt wird) und eine Kombinationsmarkierung enthält (der im letzten mañana besteht tatsächlich aus zwei Symbolen: U + 006E LATIN SMALL LETTER N und U + 0303 TILDE KOMBINIEREN).

Die Reihenfolge, in der Ersatzpaare erscheinen, kann nicht umgekehrt werden, sonst erscheint das Astralsymbol nicht mehr in der "umgekehrten" Zeichenfolge. Deshalb haben Sie diese ��-Markierungen in der Ausgabe des vorherigen Beispiels gesehen.

Kombinationsmarkierungen werden immer auf das vorherige Symbol angewendet. Daher müssen Sie sowohl das Hauptsymbol (U + 006E LATIN SMALL LETTER N) als Kombinationsmarkierung (U + 0303 COMBINING TILDE) als Ganzes behandeln. Wenn Sie ihre Reihenfolge umkehren, wird die Kombinationsmarkierung mit einem anderen Symbol in der Zeichenfolge gekoppelt. Deshalb hatte die Beispielausgabe anstelle von ñ.

Hoffentlich erklärt das, warum alle bisher veröffentlichten Antworten falsch sind.


Um Ihre erste Frage zu beantworten - wie Sie eine Zeichenfolge in JavaScript umkehren -, habe ich eine kleine JavaScript-Bibliothek geschrieben, die Unicode-fähige Zeichenkettenumkehrung ermöglicht. Es gibt keine der Probleme, die ich gerade angesprochen habe. Die Bibliothek heißt Esrever ; Der Code befindet sich auf GitHub und funktioniert in nahezu jeder JavaScript-Umgebung. Es wird mit einem Shell-Hilfsprogramm/Binärprogramm geliefert, sodass Sie Strings von Ihrem Terminal aus problemlos umkehren können, wenn Sie möchten.

var input = 'foo ???? bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab ???? oof'
72
Mathias Bynens
String.prototype.reverse = function () {
    return this.split("").reverse().join("");
}

Inspiriert von dem ersten Ergebnis habe ich bekommen, als ich einen Google für javascript string reverse gemacht habe.

8
Brian Campbell
// 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
kennebec

Google härter, Bros. Dies ist von 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

4
Mr. X

reverse ist eine Funktion in einem Array und das ist eine Zeichenfolge. Sie können den String in ein Array auflösen, umkehren und ihn dann wieder zusammenfügen.

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

Dies ist wahrscheinlich der für alle Browser akzeptable Weg:

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

Nennen Sie es wie ein Zauber:

reverse('your_string');
1
Umair Hamid
<!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>
1
Mayur Narula

Wenn die Zeichenfolge zurückgesetzt werden muss, aber der ursprüngliche Wert des Fehlers zurückgegeben wird:

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);
    }
}
0
Hiago Balbino

Verwenden Sie diese einfache Methode, um die Wörter einer Zeichenfolge an ihrer Position umzukehren

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

Diese Reverse-Prototyp-Funktion wird mit "this" implementiert. Wenn Sie die Protokollkonsole von "this" sehen, wird das Array generiert, und es hat die length-Eigenschaft . Damit es !!! Verwenden Sie einfach Reverse-for-loop, wie im Code-Snippet gezeigt.

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

0
Pankaj Unhale

Mathias Bynens, Ihr Code funktioniert dankbar, vielen Dank!

Ich konvertiere Ihren Code in eine Funktion, so dass Benutzer es von hier kopieren können.

Vielen Dank!

//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;
}
0
Roy Shoa

Ich denke, Sie werden feststellen, dass reverse () in jQuery keine Funktion ist. Übrigens, jQuery ist wirklich gut darin, Ihr DOM zu manipulieren, ist aber nicht wirklich für die String-Manipulation an sich (obwohl Sie wahrscheinlich Plugins/eigene schreiben können).

Die beste Methode, die ich gefunden habe, um eine Zeichenfolge in Javascript umzukehren, ist Folgendes:

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

Gefunden bei: http://www.bytemycode.com/snippets/snippet/400/

Ich denke, Sie werden feststellen, dass, wenn Sie den oben genannten Code irgendwo in Ihren Code einfügen, Ihr Aufruf von .reverse () funktionieren sollte :)

0
Iain Fraser
String.prototype.strReverse = function() {

    var newstring = "";

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

    return newstring;
};
0
Abhi