0

文字列を入力として受け取り、各文字をアルファベット順にシフトする単純な関数を作成しようとしています。(a -> b) (f -> g) (z -> a)。これまでの私の機能は壊れています。これについてもっと良い方法があると確信していますが、誰かが私の機能を喜んでトラブルシューティングしてくれるなら、それは素晴らしいことです. :)

function translate(str) {
  var alphabet = ['a','b','c','d','e','f','g','h','i','j','k',
                'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
  str.toLowerCase();
  var i = 0;
  var j;
  //edit: deleted str = ""

while (i < str.length) {
  for (j = 0; j < alphabet.length; j++) {
    if (str[i] == alphabet[alphabet.length - 1]) { //changed data type
        str += alphabet[0]
        j=0;
      } else if (str[i] == alphabet[j]) {
        str += alphabet[j+1]; //fixed this
        j=0;
      } else {
        i++; 
      }
    }
  }
  return str; 
4

4 に答える 4

2

charCodeAtと を使用しfromCharCodeてシフトを実現することもできます。私はもう少し便利かもしれません:

function translate(str) {
    res = [];
    for (var i = 0; i < str.length; i++) {
        var ch = str.charCodeAt(i);

        //65 => A
        //90 => Z
        //97 => a
        //122 => z

        //if ch betweet A and Z or between a and z
        if ((ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122)) {
            //if z or Z transform to a or A respectively
            if (ch === 90 || ch === 122) ch -= 25;
            //else increase by one
            else ch += 1;
        }
        res.push(ch);
    }
    return = String.fromCharCode.apply(this, res);
}

どちらの方法も、文字列の Unicode 表現を使用します。基本的に、単一の文字を数字に変換し、それらの数字を 1 増やして文字に戻します。各文字の値を示すユニコード表は次のとおりです: http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec

于 2013-06-25T19:43:52.750 に答える
1

あなたの論理には少し欠陥があります。文字列を繰り返し処理indexOfし、モジュロ演算子と一緒にメソッドを使用します。

var index = alphabet.indexOf(char.toLowerCase());

if (index === -1) {
    // char isn't in the alphabet, so you should skip it
} else {
    var newChar = alphabet[(index + 1) % alphabet.length];
}

(index + 1)1は次の文字を選択するインデックスに追加され、% alphabet.lengthの場合は先頭に戻りzます。

于 2013-06-25T19:36:23.313 に答える
0

ここにはいくつかの問題があります。

  1. var str = "";. strはパラメーターとして送信する変数なので、このステートメントでリセットします。

  2. if (str[i] == alphabet.length - 1). str[i]alphabet.length - 1は同じデータ型ではないため、このステートメントはおそらく期待どおりの動作をしていません。多分あなたはalphabet[alphabet.length - 1]代わりに持っているべきです。

  3. else if (str[i] == alphabet[j]) { str += alphabet[j]; //... }. str#1のようにリセットしなかった場合、これにより結果文字列に同じ文字が追加されます。alphabet[(j+1) % alphabet.size]代わりに次のようなものが必要です。

また、charAt(i)添え字 ( ) ではなく、文字列内の文字を取得するために使用する必要があります。ループの最後で[]呼び出す必要はありません。ループ内で既に言っているからです。j=0forj=0

于 2013-06-25T19:39:45.300 に答える