Javascript: снижение цикломатической сложности

function(response) {
  if (response.bMap && SelType === 'q') {
    setDefaultQQ(response.bMap);
  } else if (response.bMap && SelType === 'a') {
    setDefaultAA(response.bMap);
  } else if (response.bMap && SelType === 'o') {
    setDefaultOO(response.bMap);
  } else if (response.mMap && SelType === 'm') {
    setDefaultMM(response.mMap);
  } else if (response.bMap && SelType === 'p') {
    setDefaultPP(response.bMap);
  } else if (response.eMap && SelType === 'e') {
    setDefaultEE(response.eMap);
  } else {
    setDefaultData();
    showModal();
  }
}

Есть ли способ сократить это условное выражение до более короткой формы и лучшей читаемости?


person jsduniya    schedule 08.02.2017    source источник
comment
Не совсем связаны, но кажется, что эти вопросы немного конфликтуют с вашим профилем; ).   -  person Teemu    schedule 08.02.2017


Ответы (2)


Можно использовать объект для сопоставления конкретных методов SelType

var methods = {
  'a': setDefaultQQ,
  'o': setDefaultOO,
  'm': setDefaultMM,
  ....    
}

if(response.bMap && methods[SelType]){
   methods[SelType](response.bMap);
}else{
   setDefaultData();
   showModal();
}
person charlietfl    schedule 08.02.2017
comment
вам не хватает других моих ключей eMap и Mmap - person jsduniya; 08.02.2017
comment
так что вам понадобится дополнительная логика. Я предполагаю, что вы могли бы использовать один метод и передать объект ответа в качестве аргумента и сделать все там - person charlietfl; 08.02.2017
comment
Да, я добавлял дополнительную логику, но это метод, в котором я передаю свой параметр ответа. Вы хотите добавить мне другой метод для разделения логики? - person jsduniya; 08.02.2017

На самом деле нет хорошего способа, но как насчет этого

eval("setDefault"+SelType.toUpperCase()+SelType.toUpperCase()+"(response."+SelType.toUpperCase()+"Map);");

Но точно не лучшим образом.

person kawadhiya21    schedule 08.02.2017
comment
Интересно видеть, что это можно сделать таким образом, но, пожалуйста, не используйте eval(), если вам действительно не нужно (developer.mozilla.org/en/docs/Web/JavaScript/Reference/). У вас есть код, и ответ @ charlietfl доказывает, что в этом нет необходимости :) - person atwright147; 08.02.2017
comment
Я хотел сделать его динамичным. Если когда-нибудь вы добавите еще один SelType, вам не придется возвращаться и обновлять SelType ключ для сопоставления функций и т. Д. - person kawadhiya21; 08.02.2017
comment
kawadhiya21, что имеет смысл, но все же мне не разрешено использовать здесь eval .. - person jsduniya; 08.02.2017