4

今日の仕事で、すでに書いた関数の逆を書く必要がある状況に出くわしましたが、逆を手動で書くのは非効率的であることがわかりました。元の関数を更新する必要があり、対応する変更で逆関数を更新する必要がありました。私が話している関数は次のようになります。

var f = function(id, str) {
  if (id === 0) {
    return str.substring(0, 4) + " " + str.substring(4, 8);
  } else if (id === 1) {
    return str.substring(0, 3) + "/" + str.substring(3, 8);
  } else if (id === 2) {
    return str.substring(0, 4) + "-" + str.substring(4, 8);
  } else if (id == 3) {
    return str.substring(0, 3) + "," + str.substring(3, 8);
  }
}

たとえば、f(0, "ABCDEFGH")を返し"ABCD EFGH"ます。f(id, str)関数を使用して出力から入力を取得する逆関数が必要です。したがってfinverse(formattedStr)、対応する入力の辞書を返す必要があります。たとえば、finverse("ABCD EFGH")を返す必要があり{ id: 0, str: "ABCDEFGH" }ます。f元の関数を追加の「else if」句で更新したとしても、更新する必要がないように、既存の関数を使用してこの逆を書くことは可能でしょうかfinverse。言い換えれfinverseば、出力を入力に戻すために if ステートメントを使用して手動で構築するのではなく、元の関数を何らかの形で操作して逆関数を作成したいと考えています。これはJavaScriptで可能ですか?

4

2 に答える 2

3

少しリファクタリングするだけで、タスクは実際には非常に単純になります。これらすべての if は必要ありません。実際、if は Object プロパティのルックアップよりも遅く実行されます。言うまでもなく、どこかのプライベート関数に封印されていません...

フロー ロジックなしで変換 (1 イン、1+ アウト) を実行できます。

// replace all the IF logic with an externally-modifiable logic table:
f.lut=[ [4," "], [3,"/"], [4,"-"], [3,","]  ]; //(id=index, 0=pos, 1=char)


// simplify f() using the table to make choices instead of conditionals:
function f(id, str) {
   id = f.lut[id];
   return str.substring(0, id[0]) + id[1] + str.substring(id[0], 8);
}


// use the same table in reverse to compose an inverse function:
function finverse(s){
    return  {
       id:   +f.lut.map(function(A,i){ return A[1]==s.split(/[\w]+/).filter(Boolean)[0] ? 
                         String(i):
                         ""
             }).filter(Boolean)[0][0], 
       str:  s.split(/[\W]+/).filter(Boolean).join('')
    };
 }


// first, test new version of f():
 f(0, "ABCDEFGH") // ABCD EFGH
 f(1, "ABCDEFGH") // ABC/DEFGH
 f(2, "ABCDEFGH") // ABCD-EFGH
 f(3, "ABCDEFGH") // ABC,DEFGH


// now, test the inverse:
finverse("ABCD EFGH")   //{id:0, str:"ABCDEFGH"}
finverse("ABC/DEFGH")   //{id:1, str:"ABCDEFGH"}
finverse("ABCD-EFGH")   //{id:2, str:"ABCDEFGH"}
finverse("ABC,DEFGH")   //{id:3, str:"ABCDEFGH"}

これがあなたが望んでいたものではない場合はお知らせください。100%確信が持てませんでした...

于 2013-06-29T04:51:42.317 に答える