2016-12-13 10 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"]() 
} 

Я хочу этого, если его следует избегать.

Любая помощь будет оценена по достоинству. Я хорошо, если есть какая-то альтернатива этому, если ....

+0

Шаблон, который вы пытаетесь использовать, полезен только для * точных совпадений *, а не подстрочных совпадений. – Quentin

+0

Да @Quentin. Есть ли какая-либо альтернатива или лучший способ написать, чтобы исключить выражения if else? –

ответ

1

Вы можете использовать эту технику только для точных совпадений. Я хотел бы сделать это в два этапа:

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. Но я думаю, что это осложнится, если я должен добавить другое условие в объект шаблонов (например, «объявление»). Хотя я не так хорош в этих регулярных выражениях. –

+0

Хорошо, позвольте мне переписать его для использования массивов – slezica

+0

Мои общие случаи включают только символ подчеркивания в тексте, иногда, а иногда и нет. Таким образом, имя может быть 'a_ab',' b_bc', 'ab' и т. Д. –