2012-07-09 16 views
8

とラテン語にキリル翻字、私はこの関数を作っ:はjavascript関数

function transliterate(word){ 

    var answer = ""; 

    A = new Array(); 
    A["Ё"]="YO";A["Й"]="I";A["Ц"]="TS";A["У"]="U";A["К"]="K";A["Е"]="E";A["Н"]="N";A["Г"]="G";A["Ш"]="SH";A["Щ"]="SCH";A["З"]="Z";A["Х"]="H";A["Ъ"]="'"; 
    A["ё"]="yo";A["й"]="i";A["ц"]="ts";A["у"]="u";A["к"]="k";A["е"]="e";A["н"]="n";A["г"]="g";A["ш"]="sh";A["щ"]="sch";A["з"]="z";A["х"]="h";A["ъ"]="'"; 
    A["Ф"]="F";A["Ы"]="I";A["В"]="V";A["А"]="A";A["П"]="P";A["Р"]="R";A["О"]="O";A["Л"]="L";A["Д"]="D";A["Ж"]="ZH";A["Э"]="E"; 
    A["ф"]="f";A["ы"]="i";A["в"]="v";A["а"]="a";A["п"]="p";A["р"]="r";A["о"]="o";A["л"]="l";A["д"]="d";A["ж"]="zh";A["э"]="e"; 
    A["Я"]="YA";A["Ч"]="CH";A["С"]="S";A["М"]="M";A["И"]="I";A["Т"]="T";A["Ь"]="'";A["Б"]="B";A["Ю"]="YU"; 
    A["я"]="ya";A["ч"]="ch";A["с"]="s";A["м"]="m";A["и"]="i";A["т"]="t";A["ь"]="'";A["б"]="b";A["ю"]="yu"; 

for (i in word){ 

    if (A[word[i]] === 'undefined'){ 
     answer += word[i]; 
     } 
    else { 
     answer += A[word[i]]; 
     } 

return answer; 
} 
} 

今では、ラテン語のキリル文字のテキストを翻字と単純に渡すラテンせてください。しかし、それは後で最初の字を翻訳するだけであり、ラテンの場合は答えとして未定義を与える。誰もが私にアイデアを与えることができる、何が間違っている?

+0

ide? _統合された開発環境_または_IDEA_ですか? – Daedalus

答えて

39

物事のカップル...

  1. 使用すると、使用hasOwnPropertyをフィルターに
  2. ループにリターンを入れないでください
  3. '未定義' の代わりに未定義プロトタイプ上の関数とプロパティ
  4. 新しいArray()の代わりに[]を使用
  5. []の代わりに{}を使用します。
  6. 大文字ではなく小文字の変数を使用します。大文字は、コンストラクタのために予約されている。ここで

はバートRiemens及びT.J.の勧告を組み合わせることにより

function transliterate(word){ 
    var answer = "" 
     , a = {}; 

    a["Ё"]="YO";a["Й"]="I";a["Ц"]="TS";a["У"]="U";a["К"]="K";a["Е"]="E";a["Н"]="N";a["Г"]="G";a["Ш"]="SH";a["Щ"]="SCH";a["З"]="Z";a["Х"]="H";a["Ъ"]="'"; 
    a["ё"]="yo";a["й"]="i";a["ц"]="ts";a["у"]="u";a["к"]="k";a["е"]="e";a["н"]="n";a["г"]="g";a["ш"]="sh";a["щ"]="sch";a["з"]="z";a["х"]="h";a["ъ"]="'"; 
    a["Ф"]="F";a["Ы"]="I";a["В"]="V";a["А"]="a";a["П"]="P";a["Р"]="R";a["О"]="O";a["Л"]="L";a["Д"]="D";a["Ж"]="ZH";a["Э"]="E"; 
    a["ф"]="f";a["ы"]="i";a["в"]="v";a["а"]="a";a["п"]="p";a["р"]="r";a["о"]="o";a["л"]="l";a["д"]="d";a["ж"]="zh";a["э"]="e"; 
    a["Я"]="Ya";a["Ч"]="CH";a["С"]="S";a["М"]="M";a["И"]="I";a["Т"]="T";a["Ь"]="'";a["Б"]="B";a["Ю"]="YU"; 
    a["я"]="ya";a["ч"]="ch";a["с"]="s";a["м"]="m";a["и"]="i";a["т"]="t";a["ь"]="'";a["б"]="b";a["ю"]="yu"; 

    for (i in word){ 
    if (word.hasOwnProperty(i)) { 
     if (a[word[i]] === undefined){ 
     answer += word[i]; 
     } else { 
     answer += a[word[i]]; 
     } 
    } 
    } 
    return answer; 
} 

以上の官能一つは、このようなコード...

var a = {"Ё":"YO","Й":"I","Ц":"TS","У":"U","К":"K","Е":"E","Н":"N","Г":"G","Ш":"SH","Щ":"SCH","З":"Z","Х":"H","Ъ":"'","ё":"yo","й":"i","ц":"ts","у":"u","к":"k","е":"e","н":"n","г":"g","ш":"sh","щ":"sch","з":"z","х":"h","ъ":"'","Ф":"F","Ы":"I","В":"V","А":"a","П":"P","Р":"R","О":"O","Л":"L","Д":"D","Ж":"ZH","Э":"E","ф":"f","ы":"i","в":"v","а":"a","п":"p","р":"r","о":"o","л":"l","д":"d","ж":"zh","э":"e","Я":"Ya","Ч":"CH","С":"S","М":"M","И":"I","Т":"T","Ь":"'","Б":"B","Ю":"YU","я":"ya","ч":"ch","с":"s","м":"m","и":"i","т":"t","ь":"'","б":"b","ю":"yu"}; 

function transliterate(word){ 
    return word.split('').map(function (char) { 
    return a[char] || char; 
    }).join(""); 
} 
+0

私はこの質問を毎回やり直しています。これが最もコンパクトで、この問題に対処するために使用可能なコードがあります。ありがとう! – tftd

+2

機能的なものを好んだ。コンパクトで簡潔! – Faramarz

+0

こんにちは、それを行うライブラリがあるかどうか知っていますか? (他のアルファベットにも必要です) – franck

2

あなたの主な問題は、returnが間違った場所にあることです。それはの中にループです。したがって、最初の繰り返しで戻ります。それを次のように変更してください:

function transliterate(word){ 

    var answer = ""; 

    A = new Array(); 
    A["Ё"]="YO";A["Й"]="I";A["Ц"]="TS";A["У"]="U";A["К"]="K";A["Е"]="E";A["Н"]="N";A["Г"]="G";A["Ш"]="SH";A["Щ"]="SCH";A["З"]="Z";A["Х"]="H";A["Ъ"]="'"; 
    A["ё"]="yo";A["й"]="i";A["ц"]="ts";A["у"]="u";A["к"]="k";A["е"]="e";A["н"]="n";A["г"]="g";A["ш"]="sh";A["щ"]="sch";A["з"]="z";A["х"]="h";A["ъ"]="'"; 
    A["Ф"]="F";A["Ы"]="I";A["В"]="V";A["А"]="A";A["П"]="P";A["Р"]="R";A["О"]="O";A["Л"]="L";A["Д"]="D";A["Ж"]="ZH";A["Э"]="E"; 
    A["ф"]="f";A["ы"]="i";A["в"]="v";A["а"]="a";A["п"]="p";A["р"]="r";A["о"]="o";A["л"]="l";A["д"]="d";A["ж"]="zh";A["э"]="e"; 
    A["Я"]="YA";A["Ч"]="CH";A["С"]="S";A["М"]="M";A["И"]="I";A["Т"]="T";A["Ь"]="'";A["Б"]="B";A["Ю"]="YU"; 
    A["я"]="ya";A["ч"]="ch";A["с"]="s";A["м"]="m";A["и"]="i";A["т"]="t";A["ь"]="'";A["б"]="b";A["ю"]="yu"; 

    for (i in word){ 

     if (A[word[i]] === 'undefined'){ 
      answer += word[i]; 
      } 
     else { 
      answer += A[word[i]]; 
      } 

    } 
    return answer; // <=== Was *above* the } on the previous line 
} 

インデントを修正しました。一貫したインデントは、これらの種類のバグを回避するのに役立ちます。


注1:それはArrayだという事実を使用して、あなたのAオブジェクトに関する何もありません。あなたは地図として使っています。 JavaScriptでは、すべてのオブジェクトはマップなので、A = new Array();ではなくA = {};を使用してください。

注2:Aiはあなたの関数で決して宣言されていないので、あなたはThe Horror of Implicit Globalsに落ちています。それを修正するには、varと宣言してください。

注3:for..inを使用して文字列の文字をループしたり、[]を文字列にインデックス付けしたりすることは、JavaScriptエンジン間で信頼性がありません。その代わりにfor (i = 0; i < word.length; ++i)を使用し、次にch = word.charAt(i);を使用して、その位置にある文字を取得してから、ループ内のコードにchを使用してください。

注4:あなたはあなたのコードを短くするCuriously powerful || operatorを使用することができ、例えば:

answer += A[ch] || ch; 
3

は、このタスクのための配列を使用しないでください。文字列を反復するのに、for inを使用しないでください。文字列"undefined"をチェックしないでください。 forループ内にreturnを入れないでください。

function transliterate(word) { 
    var A = {}; 
    var result = ''; 

    A["Ё"]="YO";A["Й"]="I";A["Ц"]="TS";A["У"]="U";A["К"]="K";A["Е"]="E";A["Н"]="N";A["Г"]="G";A["Ш"]="SH";A["Щ"]="SCH";A["З"]="Z";A["Х"]="H";A["Ъ"]="'"; 
    A["ё"]="yo";A["й"]="i";A["ц"]="ts";A["у"]="u";A["к"]="k";A["е"]="e";A["н"]="n";A["г"]="g";A["ш"]="sh";A["щ"]="sch";A["з"]="z";A["х"]="h";A["ъ"]="'"; 
    A["Ф"]="F";A["Ы"]="I";A["В"]="V";A["А"]="A";A["П"]="P";A["Р"]="R";A["О"]="O";A["Л"]="L";A["Д"]="D";A["Ж"]="ZH";A["Э"]="E"; 
    A["ф"]="f";A["ы"]="i";A["в"]="v";A["а"]="a";A["п"]="p";A["р"]="r";A["о"]="o";A["л"]="l";A["д"]="d";A["ж"]="zh";A["э"]="e"; 
    A["Я"]="YA";A["Ч"]="CH";A["С"]="S";A["М"]="M";A["И"]="I";A["Т"]="T";A["Ь"]="'";A["Б"]="B";A["Ю"]="YU"; 
    A["я"]="ya";A["ч"]="ch";A["с"]="s";A["м"]="m";A["и"]="i";A["т"]="t";A["ь"]="'";A["б"]="b";A["ю"]="yu"; 

    for(var i = 0; i < word.length; i++) { 
     var c = word.charAt(i); 

     result += A[c] || c; 
    } 

    return result; 
} 

Here is a jsFiddle demonstration.

+0

'var i'をループ構造体に入れないでください。ループ本体に 'var c'を入れないでください。理由:[*悪い、誤解された 'var' *](http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html)+1そうでなければ+1 –

+0

@TJCrowder:私はそれが関数スコープであり、私はその事実に完全に満足しています。これは単なるコーディング規約です。ありがとう、結構です。 –

+0

@ Charmander:悪いもの。あなたのコードを維持している人々を積極的に誤解させたいのであれば、是非、続けてください。 ;-)( 'let'はJavaScriptに来て、' var'をもっと不安定なものにしています。) –

0

ありますCrowder私はこのコードを思いついたので、うまくやっていきます。

function transliterate(word){ 

    var answer = ""; 
    var a = {} 

    a["Ё"]="YO";a["Й"]="I";a["Ц"]="TS";a["У"]="U";a["К"]="K";a["Е"]="E";a["Н"]="N";a["Г"]="G";a["Ш"]="SH";a["Щ"]="SCH";a["З"]="Z";a["Х"]="H";a["Ъ"]="'"; 
    a["ё"]="yo";a["й"]="i";a["ц"]="ts";a["у"]="u";a["к"]="k";a["е"]="e";a["н"]="n";a["г"]="g";a["ш"]="sh";a["щ"]="sch";a["з"]="z";a["х"]="h";a["ъ"]="'"; 
    a["Ф"]="F";a["Ы"]="I";a["В"]="V";a["А"]="a";a["П"]="P";a["Р"]="R";a["О"]="O";a["Л"]="L";a["Д"]="D";a["Ж"]="ZH";a["Э"]="E"; 
    a["ф"]="f";a["ы"]="i";a["в"]="v";a["а"]="a";a["п"]="p";a["р"]="r";a["о"]="o";a["л"]="l";a["д"]="d";a["ж"]="zh";a["э"]="e"; 
    a["Я"]="Ya";a["Ч"]="CH";a["С"]="S";a["М"]="M";a["И"]="I";a["Т"]="T";a["Ь"]="'";a["Б"]="B";a["Ю"]="YU"; 
    a["я"]="ya";a["ч"]="ch";a["с"]="s";a["м"]="m";a["и"]="i";a["т"]="t";a["ь"]="'";a["б"]="b";a["ю"]="yu"; 

    for (i = 0; i < word.length; ++i){ 

     answer += a[word[i]] === undefined ? word[i] : a[word[i]]; 
    } 
    return answer; 
} 

あなたより!

+1

クール!あなたは私の最新の機能版を見ましたか? :-) –

+0

@Bart Riemens最初は気付きませんでしたが、より短くより普遍的な縫い目です。 – kyng

1

jsのロシア語の記号は、私のシステムでまったく動作しません。どうしてか分かりません。したがって、次のコードを使用します。

すべての句読点を「_」で置き換え、すべてを小文字に置き換えます。

function translit(str){ 
 
\t var sp = '_'; 
 
\t var text = str.toLowerCase(); 
 
\t var transl = { 
 
\t \t '\u0430': 'a', '\u0431': 'b', '\u0432': 'v', '\u0433': 'g', '\u0434': 'd', '\u0435': 'e', '\u0451': 'e', '\u0436': 'zh', 
 
\t \t '\u0437': 'z', '\u0438': 'i', '\u0439': 'j', '\u043a': 'k', '\u043b': 'l', '\u043c': 'm', '\u043d': 'n', '\u043e': 'o', 
 
\t \t '\u043f': 'p', '\u0440': 'r', '\u0441': 's', '\u0442': 't', '\u0443': 'u', '\u0444': 'f', '\u0445': 'h', '\u0446': 'c', 
 
\t \t '\u0447': 'ch', '\u0448': 'sh', '\u0449': 'shch', '\u044a': '\'', '\u044b': 'y', '\u044c': '', '\u044d': 'e', '\u044e': 'yu', 
 
\t \t '\u044f': 'ya', \t \t 
 
\t \t '\u00AB':'_', '\u00BB':'_', // «» 
 
\t \t ' ': sp, '_': sp, '`': sp, '~': sp, 
 
\t \t '!': sp, '@': sp, '#': sp, '$': sp, 
 
\t \t '%': sp, '^': sp, '&': sp, '*': sp, '(': sp, ')': sp, '-': sp, '\=': sp, 
 
\t \t '+': sp, '[': sp, ']': sp, '\\': sp, '|': sp, '/': sp, '.': sp, ',': sp, 
 
\t \t '{': sp, '}': sp, '\'': sp, '"': sp, ';': sp, ':': sp, '?': sp, '<': sp, 
 
\t \t '>': sp, '№': sp \t \t \t \t \t 
 
\t } 
 
    var result = ''; 
 
\t var curent_sim = ''; 
 
    for(i=0; i < text.length; i++) { 
 
\t \t if(transl[text[i]] != undefined) { \t \t \t 
 
\t \t \t if(curent_sim != transl[text[i]] || curent_sim != sp){ 
 
\t \t \t \t result += transl[text[i]]; 
 
\t \t \t \t curent_sim = transl[text[i]]; \t \t \t \t 
 
\t \t \t } \t \t \t \t \t 
 
\t \t } else { 
 
\t \t \t result += text[i]; 
 
\t \t \t curent_sim = text[i]; 
 
\t \t } \t \t 
 
    } 
 
\t result = result.replace(/^_/, '').replace(/_$/, ''); // trim 
 
\t return result 
 
} 
 

 
var result = translit('Привет Мир!'); 
 
document.getElementById('alias').value = result;
<html> 
 
    <body> 
 
    <input name="name" type="text" id="alias" /> 
 
    </body> 
 
</html>

コードは元々ここに取られました:http://ajaxs.ru/lesson/js/137-transliteracija_stroki_na_javascript.html、その後、リファクタリング。

私は翻字のこの方法を使用しています私のプロジェクトで
3

:私は(各文字で始まる彼らのユニコード類似して、すべてのロシア語の手紙を交換した

transliterate('абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'); 

:このサンプルは翻字する

var transliterate = function(text) { 

    text = text 
     .replace(/\u0401/g, 'YO') 
     .replace(/\u0419/g, 'I') 
     .replace(/\u0426/g, 'TS') 
     .replace(/\u0423/g, 'U') 
     .replace(/\u041A/g, 'K') 
     .replace(/\u0415/g, 'E') 
     .replace(/\u041D/g, 'N') 
     .replace(/\u0413/g, 'G') 
     .replace(/\u0428/g, 'SH') 
     .replace(/\u0429/g, 'SCH') 
     .replace(/\u0417/g, 'Z') 
     .replace(/\u0425/g, 'H') 
     .replace(/\u042A/g, '') 
     .replace(/\u0451/g, 'yo') 
     .replace(/\u0439/g, 'i') 
     .replace(/\u0446/g, 'ts') 
     .replace(/\u0443/g, 'u') 
     .replace(/\u043A/g, 'k') 
     .replace(/\u0435/g, 'e') 
     .replace(/\u043D/g, 'n') 
     .replace(/\u0433/g, 'g') 
     .replace(/\u0448/g, 'sh') 
     .replace(/\u0449/g, 'sch') 
     .replace(/\u0437/g, 'z') 
     .replace(/\u0445/g, 'h') 
     .replace(/\u044A/g, "'") 
     .replace(/\u0424/g, 'F') 
     .replace(/\u042B/g, 'I') 
     .replace(/\u0412/g, 'V') 
     .replace(/\u0410/g, 'a') 
     .replace(/\u041F/g, 'P') 
     .replace(/\u0420/g, 'R') 
     .replace(/\u041E/g, 'O') 
     .replace(/\u041B/g, 'L') 
     .replace(/\u0414/g, 'D') 
     .replace(/\u0416/g, 'ZH') 
     .replace(/\u042D/g, 'E') 
     .replace(/\u0444/g, 'f') 
     .replace(/\u044B/g, 'i') 
     .replace(/\u0432/g, 'v') 
     .replace(/\u0430/g, 'a') 
     .replace(/\u043F/g, 'p') 
     .replace(/\u0440/g, 'r') 
     .replace(/\u043E/g, 'o') 
     .replace(/\u043B/g, 'l') 
     .replace(/\u0434/g, 'd') 
     .replace(/\u0436/g, 'zh') 
     .replace(/\u044D/g, 'e') 
     .replace(/\u042F/g, 'Ya') 
     .replace(/\u0427/g, 'CH') 
     .replace(/\u0421/g, 'S') 
     .replace(/\u041C/g, 'M') 
     .replace(/\u0418/g, 'I') 
     .replace(/\u0422/g, 'T') 
     .replace(/\u042C/g, "'") 
     .replace(/\u0411/g, 'B') 
     .replace(/\u042E/g, 'YU') 
     .replace(/\u044F/g, 'ya') 
     .replace(/\u0447/g, 'ch') 
     .replace(/\u0441/g, 's') 
     .replace(/\u043C/g, 'm') 
     .replace(/\u0438/g, 'i') 
     .replace(/\u0442/g, 't') 
     .replace(/\u044C/g, "'") 
     .replace(/\u0431/g, 'b') 
     .replace(/\u044E/g, 'yu'); 

    return text; 
}; 

ラン\ u)Javascriptファイルのエンコーディングに関する問題を解決します。

実行速度を確認するために、私はこの質問に最もよく答えて、私の例と比較しました。私の方法は、いくつかの時間で速かったようです(Firebugでは0.16 ms :-)。

speed comparison in firebug

+1

良い解決策、ありがとう! – Kholiavko