Обращение строки в JavaScript

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

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

но firebug говорит мне, что oneway.reverse() не является функцией. Любые идеи?

Спасибо

Ответ 1

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

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

Обновление

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

Ответ 2

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

Если вы задаетесь вопросом, почему это происходит, читать внутреннюю кодировку JavaScripts. (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 LATIN SMALL LETTER N и U + 0303 COMBINING TILDE).

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

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

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


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

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

Ответ 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
*/

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

Назовите его как шарм:

reverse('your_string');

Ответ 9

Я думаю, вы обнаружите, что на самом деле 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() должен работать:)

Ответ 10

String.prototype.strReverse = function() {

    var newstring = "";

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

    return newstring;
};

Ответ 11

Матиас Биненс, ваш код работает, спасибо большое!

Я конвертирую ваш код в функцию, таким образом, пользователи могут копировать его здесь.

Спасибо!

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

Ответ 12

Эта функция обратного прототипа реализована с использованием "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());

Ответ 13

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

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