web-dev-qa-db-fra.com

Inverser une chaîne en JavaScript

J'essaie d'inverser une chaîne d'entrée

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

mais firebug me dit que oneway.reverse() n'est pas une fonction. Des idées?

Je vous remercie

47
drummer

reverse() est une méthode d'instances de tableau. Cela ne fonctionnera pas directement sur une chaîne. Vous devez d’abord scinder les caractères de la chaîne en un tableau, inverser le tableau, puis rejoindre une chaîne:

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

Mettre à jour

La méthode ci-dessus n'est sûre que pour les chaînes "normales". S'il vous plaît voir le commentaire de Mathias Bynens ci-dessous et aussi sa réponse pour une méthode inverse en toute sécurité.

112
Ates Goral

La technique suivante (ou similaire) est couramment utilisée pour inverser une chaîne en JavaScript:

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

En fait, toutes les réponses affichées jusqu’à présent sont une variation de ce schéma. Cependant, cette solution pose quelques problèmes. Par exemple:

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

Si vous vous demandez pourquoi cela se produit, lisez le code interne de JavaScript . (TL; DR: ???? est un symbole astral et JavaScript l'expose sous forme de deux unités de code distinctes.)

Mais il y a plus:

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

Une bonne chaîne pour tester les implémentations inverses de chaîne est la suivante :

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

Pourquoi? Parce qu’il contient un symbole astral (????) (qui sont représentés par des paires de substitution en JavaScript ) et une marque de combinaison (le du dernier mañana est en fait composé de deux symboles: U + 006E LETTRE MINUSCULE LATINE N et U + 0303 COMBINAISON DE TILDE).

L’ordre dans lequel les paires de substitution apparaissent ne peut pas être inversé, sinon le symbole astral n’apparaîtra plus dans la chaîne «inversée». C’est pourquoi vous avez vu ces marques �� dans la sortie de l’exemple précédent.

Les marques de combinaison sont toujours appliquées au symbole précédent. Vous devez donc traiter le symbole principal (L + L6 Petite Lettre Latine U + U) comme de la marque de combinaison (U + 0303 Combiner Tile) dans son ensemble. Si vous inversez leur ordre, la marque de combinaison sera associée à un autre symbole de la chaîne. C’est pourquoi l’exemple de sortie comportait au lieu de ñ.

Espérons que cela explique pourquoi toutes les réponses postées jusqu’à présent sont faux.


Pour répondre à votre question initiale - comment inverser [correctement] une chaîne en JavaScript -, j’ai écrit une petite bibliothèque JavaScript capable d’inverser la chaîne Unicode. Il n’a aucun des problèmes que je viens de mentionner. La bibliothèque s'appelle Esrever ; son code est sur GitHub, et il fonctionne dans pratiquement tous les environnements JavaScript. Il est livré avec un utilitaire/binaire Shell, de sorte que vous pouvez facilement inverser les chaînes de votre terminal si vous le souhaitez.

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

Inspiré par le premier résultat J'ai obtenu lorsque j'ai créé un Google pour javascript string reverse .

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 plus fort, bros. Ceci est par 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 est une fonction sur un tableau et c'est une chaîne. Vous pouvez aussi exploser la chaîne dans un tableau, l'inverser et le combiner ensuite.

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

C'est probablement le chemin, acceptable pour tous les navigateurs:

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

Appelez ça comme un charme:

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

Utilisez cette méthode simple pour inverser les mots d'une chaîne à sa position

 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

Cette fonction de prototype inverse est implémentée avec "this". Si vous voyez la console de journal de "this", il générera le tableau, et il a la propriété length . Alors que ça !!! Il suffit d’utiliser reverse "for-loop" comme indiqué dans l’extrait de code.

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, votre code fonctionne bien, merci beaucoup!

Je convertis votre code en une fonction afin que les utilisateurs puissent le copier à partir d'ici.

Merci!

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

Je pense que vous constaterez qu'en fait, reverse () n'est pas une fonction de jQuery. Incidemment, jQuery est vraiment doué pour manipuler votre DOM, mais n'est pas vraiment pour la manipulation de chaîne en tant que telle (bien que vous puissiez probablement obtenir des plugins/écrire le vôtre) pour le faire.

La meilleure façon que j'ai trouvée d'inverser une chaîne en javascript est la suivante:

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

Trouvé à: http://www.bytemycode.com/snippets/snippet/400/

Je pense que vous constaterez que si vous insérez ce qui précède dans votre code quelque part, votre appel à .reverse () devrait fonctionner :)

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