0
var input="string to be reversed";
function reverse(reversestring)
{
   var result;
   for(var i=reversestring.length-1;i>=0;i--)   
     {
     result+=reversestring[i];
     }
     return result;
}
console.log(reverse(input));

上記のコードを教えてください。

4

3 に答える 3

1

文字列をパーツの配列に分割する方が簡単です。その後、javascript には配列の順序を逆にする reverse() メソッドがあり、再び結合することができます。

var input  = "string to be reversed";
var output = input.split('').reverse().join('');

フィドル

于 2013-07-20T19:12:51.153 に答える
0

次の手法 (または類似の手法) は、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 はそれを 2 つの別個のコード単位として公開します。)

しかし、もっとあります:

// 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は実際には 2 つの記号で構成されます: U+006E LATIN SMALL LETTER N と U+0303 COMBINING TILDE) が含まれているためです。

サロゲート ペアの順序を逆にすることはできません。そうしないと、アストラル シンボルが「逆」文字列に表示されなくなります。前の例の出力にこれらの��マークが表示されたのはそのためです。

結合マークは常に前の記号に適用されるため、両方のメイン記号 (U+006E LATIN SMALL LETTER N) を結合マーク (U+0303 COMBINING TILDE) 全体として扱う必要があります。順序を逆にすると、結合マークが文字列内の別の記号とペアになります。そのため、出力例の代わりにñ.

うまくいけば、これまでに投稿されたすべての回答が間違っている理由が説明されています.


最初の質問 — JavaScript で文字列を [適切に] 反転する方法— に答えるために、Unicode を認識した文字列反転が可能な小さな JavaScript ライブラリを作成しました。今述べた問題はありません。ライブラリはEsreverと呼ばれます。そのコードは GitHub にあり、ほぼすべての JavaScript 環境で動作します。シェルユーティリティ/バイナリが付属しているため、必要に応じて端末から文字列を簡単に逆にすることができます。

var input = 'foo  bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab  oof'
于 2014-03-31T07:02:00.453 に答える