最速になる translate() 関数を考える

叩かれ台ならすぐに思いつくのだけれど、「最速」となると・・・

<!DOCTYPE html>
<title></title>
<script>

(function () {

  var hankaku = [
    ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/',
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?',
    '@', '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', '[','\\', ']', '^', '_',
    '`', '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', '{', '|', '}', '~'
  ];
  
  var zenkaku = [
    ' ','!','”','#','$','%','&','’','(',')','*','+',',','−','.','/',
    '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?',
    '@','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','[','¥',']','^','_',
    '‘','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','{','|','}','〜'
  ];
  
  var haiueo  = [
    'ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ','ダ','ヂ','ヅ','デ','ド','バ',
    'ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ',
    '。', '「', '」', '、', '・', 'ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー',
    'ア', 'イ', 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ', 'タ',
    'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ', 'ホ', 'マ', 'ミ',
    'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ン', '゙', '゚'
  ].concat (hankaku);
  
  var zaiueo = [
    'ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ','ダ','ヂ','ヅ','デ','ド','バ',
    'ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ',
    '。','「','」','、','・','ヲ','ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ','ー',
    'ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ','タ',
    'チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ',
    'ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ン','゛','゜'
  ].concat (zenkaku);

  var z2aiueo = [
    'カ゛','キ゛','ク゛','ケ゛','コ゛','サ゛','シ゛','ス゛','セ゛','ソ゛','タ゛','チ゛','ツ゛','テ゛','ト゛','ハ゛',
    'ヒ゛','フ゛','ヘ゛','ホ゛','ハ゜','ヒ゜','フ゜','へ゜','ホ゜',
    '。','「','」','、','・','ヲ','ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ','ー',
    'ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ','タ',
    'チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ',
    'ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ン','゛','゜'
  ].concat (zenkaku);

  var zhaiueo = [
    'が','ぎ','ぐ','げ','ご','ざ','じ','ず','ぜ','ぞ','だ','ぢ','づ','で','ど','ば',
    'び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ',
    '。','「','」','、','・','を','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー',
    'あ','い','う','え','お','か','き','く','け','こ','さ','し','す','せ','そ','た',
    'ち','つ','て','と','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ま','み',
    'む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','ん','゛','゜'
  ].concat (zenkaku);


  function translate (string, ary1, ary2) {
    var result = [];
    var len = string.length;
    var ary0 = string.split ('');
    var i;
    var idx;

    for (i = 0; i < len; i++) {
      idx = ary1.indexOf (ary0[i]);
      result[i] = (idx < 0) ? ary0[i]: ary2[idx];
    }
    
    return result.join ('');
  }


  // 前方一致で置き換える
  function translate2 (string, ary1, ary2) {
    var result = [];
    var max = string.length;
    var cnt = 0;
    var idx = 0;
    var len;
    var tgt;
    var I = ary1.length;
    var i;
    
    
//    ary1.sort (comparisonOfLength);
    
    while (cnt < max) {
      next: {
        for (i = 0; i < I; i++) {
          len = String(ary1[i]).length;
          tgt = string.substring (cnt, cnt + len);
          idx = ary1.indexOf (tgt);
          if (-1 < idx) {
            result.push (ary2[idx]);
            cnt += len;
            break next;
          }
        }
        result.push (string.substring (cnt, cnt+1));
        cnt++;
      }
    }
    return result.join ('');
  }
  
  function comparisonOfLength (a, b) {
    var len_a = a.length;
    var len_b = b.length;
    return (len_b - len_a) - (len_a - len_b);
  }


  function toHankaku (string) {
    return translate (string, zenkaku, hankaku);
  }


  function toZenkaku (string) {
    return translate (string, hankaku, zenkaku);
  }

  function toZenkakuKATAKANA (string) {
    return translate2 (string, haiueo, zaiueo);
  }

  function toHankakuKATAKANA (string) {
    return translate (string, zaiueo, haiueo);
  }

  this.covertCharacter = {
    toHankaku : toHankaku,
    toZenkaku : toZenkaku,
    toZenkakuKATAKANA : toZenkakuKATAKANA,
    toHankakuKATAKANA : toHankakuKATAKANA
  }
})();

var zen = 'ゲッ!ヤツラニ、ギャフントイワセタイモノダ!';

document.write([zen, covertCharacter.toHankakuKATAKANA (zen)].join("<br>"));

</script>