Я пытаюсь изменить строку ввода
var oneway = $('#inputfield').val();
var backway = oneway.reverse();
но firebug говорит мне, что oneway.reverse()
не является функцией. Любые идеи?
Спасибо
Я пытаюсь изменить строку ввода
var oneway = $('#inputfield').val();
var backway = oneway.reverse();
но firebug говорит мне, что oneway.reverse()
не является функцией. Любые идеи?
Спасибо
reverse()
- метод экземпляров массива. Он не будет напрямую работать с строкой. Вы должны сначала разделить символы строки на массив, отменить массив и затем присоединиться к строке:
var backway = oneway.split("").reverse().join("");
Обновление
Вышеуказанный метод безопасен только для "обычных" строк. Пожалуйста, см. Комментарий Матиаса Биненса ниже, а также его ответ для безопасного обратного метода.
Следующий метод (или аналогичный) обычно используется для изменения строки в 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'
String.prototype.reverse = function () {
return this.split("").reverse().join("");
}
Вдохновленный первый результат, который я получил, когда я сделал Google для javascript string reverse.
// 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
*/
Google сложнее, братья. Это Эдд Манн.
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/
reverse
- это функция в массиве, которая является строкой. Вы можете взорвать строку в массив, а затем перевернуть ее, а затем объединить ее вместе.
var str = '0123456789';
var rev_str = str.split('').reverse().join('');
<!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>
Это, вероятно, способ, приемлемый для всех браузеров:
function reverse(s) {
var o = '';
for (var i = s.length - 1; i >= 0; i--)
o += s[i];
return o;
}
Назовите его как шарм:
reverse('your_string');
Я думаю, вы обнаружите, что на самом деле 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() должен работать:)
String.prototype.strReverse = function() {
var newstring = "";
for (var s=0; s < this.length; s++) {
newstring = this.charAt(s) + newstring;
}
return newstring;
};
Матиас Биненс, ваш код работает, спасибо большое!
Я конвертирую ваш код в функцию, таким образом, пользователи могут копировать его здесь.
Спасибо!
//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;
}
Эта функция обратного прототипа реализована с использованием "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());
Используйте этот простой метод для преобразования слов строки в ее положение
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');