2016-12-13 4 views
1

私は既存のプロジェクトに次のコードを書いています。Javascript:オブジェクトリテラル表記のindexOf

//selectedColumn is dynamic but will have part of the string 
if(selectedColumn.indexOf(const.abc) > -1 || selectedColumn.indexOf(const.abcd) > -1) //selectedColumn can be bc, ab etc 
{ 
    //logic 1 
} 

if(selectedColumn.indexOf(const.xyz) > -1 || selectedColumn.indexOf(const.wxyz) > -1){ //selectedColumn can be xy, yz etc 
    //logic 2 
} 
//.. so on and so forth 

他の場合は、この代わりにオブジェクトのリテラル表記を使用したいと思います。

var logicLookup = { 
    "???": function(){ //what should be the func name here 
     //logic 1 
    } 
}; 

logicLookup[selectedColumn]() 

オブジェクトリテラルの内部に関数名を入れるにはどうすればよいですか?私はオブジェクトリテラルの内部でindexOf操作を行うことができないと信じています。

私はその関数に 'ab'のような名前をつけたら、ロジックを引き出すためにもう一度やり直す必要があります。

if(selectedColumn.indexOf(const.abc) > -1 || selectedColumn.indexOf(const.abcd) > -1) 
{ 
    logicLookup["ab"]() 
} 

私はこれを避けたい。

ご協力いただければ幸いです。このif..elseコードの匂い文に代わるものがあればいいよ。

+0

使用しようとしているパターンは、部分一致と一致するものではなく、完全一致の場合にのみ有効です。 – Quentin

+0

はい@クエンチン。 else文を削除するように書くための代替手段または最良の方法はありますか? –

答えて

1

この手法は、完全一致のシナリオでのみ使用できます。私は2つのステップで行います:柔軟な表現から正確なものに行く

の1- ノーマライズ入力、:

function normalize(name) { 
    var aliasTable = { 
    'ab' : ['ab', 'abcd', 'ad'], 
    'xyz': ['xyz', 'wxyz'] 
    } 

    for (var normName in aliasTable) { 
    for (var i in aliasTable[normName]) { 
     if (name === aliasTable[normName][i]) return normName 
    } 
    } 
} 

次のようにnormalize機能が動作します。

normalize('ab') -> 'ab' 
normalize('abcd') -> 'ab' 
normalize('xyz') -> 'xyz' 
normalize('wxyz') -> 'xyz' 

normalize(anythingElse) -> undefined 

2ファンクションコールをディスパッチします。

var normName = normalize('abcd') 

var handlers = { 
    'ab' : function handleAB() { ... }, 
    'xyz': function handleXYZ() { ... }, 
} 

if (normName in handlers) { 
    handlers[normName]() 
} 
+0

ありがとう@slezica。しかし、パターンオブジェクトに別の条件( 'ad'など)を追加すると複雑になると思っています。私はそれらの正規表現ではあまりよくありません。 –

+0

Ok、配列を使用するように書き直してください – slezica

+0

私の一般的なケースでは、テキストにアンダースコア文字しか含まれないことがあります。したがって、名前は 'a_ab'、' b_bc'、 'ab'などとなります –

関連する問題