まえおき

だいたい普通に考えると、対象の文字を探してreplaceして、更に次の…と考えます。forやforEachその他のループでそれらを繰り返して変換していくということですが、replaceをするだけではその変数内で変換されているだけで、出力してはじめて変換されたテキストを取得して再度変換できるわけです。

もちろんreplaceも色々とアイデアを絞ればreplaceの中で更にreplaceして変換ということもできるのですが、reduceを利用するとこのあたりが便利に簡潔に書けます。

それがこれです。

//パターンに従ってリプレイスする
function replaceNames(text) {
  const replacements = {
    "朴王路美": "朴璐美",
    "草なぎ剛": "草彅剛"
    // 他の置換ルールを追加
  };

  const patterns = Object.keys(replacements).map(pattern => {
    return {
      pattern: new RegExp(pattern, "g"),
      replacement: replacements[pattern]
    };
  });

  return patterns.reduce((result, { pattern, replacement }) => {
    return result.replace(pattern, replacement);
  }, text);
}

動作解説

まず、replacementsは、オブジェクトで、"変換したい文字": "変換した文字"とします。これは例として草彅剛らをあげましたが、全角数字の"0-9"とそれぞれ半角の"0-9"をそれぞれ入れても良いですし、漢数字をそれぞれ対応させてもよいですがそれは文字を入れ替え変換するだけなので桁などは考慮してないため、そういうのは別の用法で行うとして、何かしらのタイトルで「(第1シリーズ)」の数字が全角であったり「(第1シリーズ)」など数字が半角だったりの表記の揺れが編集者によってある場合などは統一できます。

またTVerのようにすでに登録してある名称でいつまでたっても直らない「朴王路美」や「草なぎ剛」などは正しいものを入れておけば変換できます。大事なのはパターンが上から順番に繰り返されるということで、

const replacement = {
    "abcde": "かきくけこ",
    "おか": "BC"
};

const text = "あいうえおabcde";

const convert = replaceNames(text);
console.log(convert);
// "あいうえBCきくけこ"

このように変換されます。

最初にtextのabcdeかきくけこに変換されます。その時のテキストはあいうえおかきくけこになります。その後、次のおかBCに変換されて最終的に、あいうえBCきくけことなるわけです。

このようになるため、部分ごとに順番に変換していくことが大事です。

patternsは、replacementsから新しい配列を作っています。この配列がreplacepatternになって、変換していく事になります。

reduceは初回に値を持っておらず、何かしらを与える必要がありこれが変換する元の文字列になります。その文字列の中に該当するpatternのキーワードがあった場合はreplaceで変換していく寸法です。

最初のpatternで変換されたtextの文字列は再度textとして使用され、次のpatternに該当するキーワードがあれば変換、なければそのままがtextの値になりこれがリターンされます。結果的にreduce内部でループ→変換が次々と起こるわけです。

forなどのループでオブジェクトからpatternを作り、replaceを繰り返しても同じことではあるのですが、より簡潔に書けます。

元になる値を何度も処理をするということはあまり普段遣いではないかも知れませんが、replaceはその性格上もしかすると複数回の変換をする場合がある可能性はあるかと思います。例えば、一度目で表記の揺れというか、大文字と小文字を統一したり、何かしらを調整して、その後正しい変換をしたりとかはあるかと思います。

またオブジェクトの対応するキーと値はこれら文字の変換にも適していると思います。結局、正規表現で該当文字を見つけてreplaceするわけですから。

そういった場合に、ループで処理を書くと色々と長くなったりするので、何をどう変換しているのかをオブジェクトのキーとバリューで一目瞭然にしておくと特にわかりやすくなるのではないかと思う次第です。なんせ色々と長いスクリプトを書くと読むのも大変だし、これは何をしてるんだろうとわかりにくくなるのも良くはありません。

なんせ面倒くさいんで。できたら短く効率良く書けるのが良いかとも。