まえおき
だいたい普通に考えると、対象の文字を探して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
から新しい配列を作っています。この配列がreplace
のpattern
になって、変換していく事になります。
reduce
は初回に値を持っておらず、何かしらを与える必要がありこれが変換する元の文字列になります。その文字列の中に該当するpattern
のキーワードがあった場合はreplace
で変換していく寸法です。
最初のpattern
で変換されたtextの文字列は再度textとして使用され、次のpattern
に該当するキーワードがあれば変換、なければそのままがtextの値になりこれがリターンされます。結果的にreduce
内部でループ→変換が次々と起こるわけです。
forなどのループでオブジェクトからpattern
を作り、replace
を繰り返しても同じことではあるのですが、より簡潔に書けます。
元になる値を何度も処理をするということはあまり普段遣いではないかも知れませんが、replace
はその性格上もしかすると複数回の変換をする場合がある可能性はあるかと思います。例えば、一度目で表記の揺れというか、大文字と小文字を統一したり、何かしらを調整して、その後正しい変換をしたりとかはあるかと思います。
またオブジェクトの対応するキーと値はこれら文字の変換にも適していると思います。結局、正規表現で該当文字を見つけてreplace
するわけですから。
そういった場合に、ループで処理を書くと色々と長くなったりするので、何をどう変換しているのかをオブジェクトのキーとバリューで一目瞭然にしておくと特にわかりやすくなるのではないかと思う次第です。なんせ色々と長いスクリプトを書くと読むのも大変だし、これは何をしてるんだろうとわかりにくくなるのも良くはありません。
なんせ面倒くさいんで。できたら短く効率良く書けるのが良いかとも。