Сторнирование строки в JavaScript - PullRequest
47 голосов
/ 23 октября 2009

Я пытаюсь отменить ввод строки

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

но firebug говорит мне, что oneway.reverse() это не функция. Есть идеи?

Спасибо

Ответы [ 14 ]

113 голосов
/ 23 октября 2009

reverse() - метод экземпляров массива. Он не будет работать напрямую со строкой. Сначала вы должны разбить символы строки на массив, обратить массив и затем снова соединиться в строку:

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

Обновление

Метод, описанный выше, безопасен только для «обычных» строк. Пожалуйста, смотрите комментарий Матиаса Биненса ниже, а также его ответ для безопасного обратного метода.

72 голосов
/ 27 мая 2013

Следующий метод (или аналогичный) обычно используется для обращения строки в 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!

Если вам интересно, почему это происходит, читайте о внутренней кодировке JavaScript . (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.

Хорошей строкой для тестирования реализаций обратной строки является следующее :

'foo ? bar mañana mañana'

Почему? Поскольку он содержит астральный символ (?) (которые представлены суррогатными парами в JavaScript ) и знак объединения ( в последнем mañana фактически состоит из двух символов: U + 006E ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО N и U + 0303 КОМБИНИРОВАННАЯ ТИЛЬДА).

Порядок, в котором появляются суррогатные пары, изменить нельзя, иначе астральный символ больше не будет отображаться в «перевернутой» строке. Вот почему вы видели эти �� отметки в выводе для предыдущего примера.

Комбинированные метки всегда применяются к предыдущему символу, поэтому вы должны рассматривать оба основных символа (U + 006E LATIN SMALL LETTER N) как комбинирующие метки (U + 0303 COMBINING TILDE) в целом. Изменение их порядка приведет к объединению метки объединения с другим символом в строке. Вот почему выходной пример имел вместо ñ.

Надеюсь, это объясняет, почему все опубликованные до сих пор ответы неверны .


Чтобы ответить на ваш первоначальный вопрос - как [правильно] перевернуть строку в JavaScript - я написал небольшую библиотеку JavaScript, которая способна переворачивать строки с поддержкой Юникода. У него нет ни одной из проблем, которые я только что упомянул. Библиотека называется Esrever ; его код находится на GitHub, и он работает практически в любой среде JavaScript. Он поставляется с утилитой shell / binary, так что вы можете легко перезаписывать строки с вашего терминала, если хотите.

var input = 'foo ? bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab ? oof'
8 голосов
/ 23 октября 2009
String.prototype.reverse = function () {
    return this.split("").reverse().join("");
}

Вдохновленный первый результат Я получил, когда я сделал Google для обратная строка JavaScript .

4 голосов
/ 04 июня 2013

гугл сложнее, братан. Это Эдд Манн.

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 голосов
/ 23 октября 2009
// 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
*/
3 голосов
/ 23 октября 2009

reverse - это функция в массиве, и это строка. Вы можете взорвать строку в массив, а затем перевернуть ее и затем объединить вместе.

var str     = '0123456789';
var rev_str = str.split('').reverse().join('');
1 голос
/ 20 января 2016

Это, вероятно, способ, приемлемый для всех браузеров:

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

Назовите это как оберег:

reverse('your_string');
1 голос
/ 26 августа 2015
<!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>
0 голосов
/ 30 мая 2019

Если необходимо восстановить строку, но вернуть исходное значение ошибки:

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 голосов
/ 29 мая 2016

Используйте этот простой метод для обращения слов строки в ее позиции

 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...