如何简化长javascript开关案例声明?

时间:2012-07-04 14:36:52

标签: javascript jquery

我有以下代码。它看起来漫长而复杂,现在我必须添加更多条件。有什么方法可以简化这段代码。我能想到的只是组合City和Menu开关,但是如果我这样做,我必须为城市获取pk值,为Menu选择另一种方式。 javascript是否提供任何其他方式来执行与交换机相同的操作?对于长代码列表感到抱歉,但我认为我应该包含所有内容。

function getParams(entity) {

 var store = window.localStorage;
 var table = "Content";

 switch (entity) {
    case "City":
        if (store.getItem('AccountID')) {
            pk = store.getItem('AccountID') + "04" + "000";
            return {
                pk: pk,
                param: '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account");
            return { rc: false }
        }
        break;
    case "Menu":
        if (store.getItem('AccountID')) {
            pk = store.getItem('AccountID') + "00" + "000";
            return { 
                pk: pk,
                param: '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account");
            return { rc: false }
        }
        break;
    case "Page":
        if (store.getItem('AccountID') && store.getItem('PageID')) {
            pk = store.getItem('AccountID') + store.getItem('PageID') + "000";
            return {
                pk: pk,
                param: '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account and Page Type");
            return { rc: false }
        }
        break;
    case "Question":
        if (store.getItem('AccountID') &&
            store.getItem('CityID') && 
            store.getItem('TopicID') ) {
            pk = store.getItem('AccountID') + store.getItem('CityID');
            return {
                pk: pk,
                param: '?pk=' + pk + '&rk=' + store.getItem('TopicID'),
                table: "Question",
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account, City and Topic");
            return { rc: false }
        }
        break;
    case "Reference":
        if (store.getItem('ReferenceID')) {
            pk = store.getItem('ReferenceID');
            return { 
                pk: pk,
                param: '?pk=' + pk,
                table: "Reference",
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Reference");
            return { rc: false }
        }
        break;
    case "Topic":
        if (store.getItem('AccountID') && store.getItem('CityID')) {
            pk = store.getItem('AccountID') + "05" + store.getItem('CityID');
            return { 
                pk: pk,
                param: parameters = '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect Account and City");
            return { rc: false }
        }
        break;
    default:
        ;
}

4 个答案:

答案 0 :(得分:3)

如果是我,我会将每个案例条件中的代码移动到自己的函数中。这应该使事情更清晰。

答案 1 :(得分:3)

将这部分代码放入函数中并使用正确的参数

调用它
  if (store.getItem('AccountID')) {
             pk = store.getItem('AccountID') + "00" + "000";
             return {
                  pk: pk,
                 param: '?pk=' + pk,
                 table: table,
                 rc: true
             }
         } else {
             paramOnFailure("Please reselect Account");
             return { rc: false }
         } 

所以你的代码就像这样,并从每个Switch Case中调用这个函数

function CommonforCase(store,value)
{
   if (store.getItem('AccountID')) {
                 pk = store.getItem('AccountID') + value;
                 return {
                      pk: pk,
                     param: '?pk=' + pk,
                     table: table,
                     rc: true
                 }
             } else {
                 paramOnFailure("Please reselect Account");
                 return { rc: false }
             } 

}

答案 2 :(得分:0)

这样的事情:

function getTheItem(itemName, value, table){
         if (store.getItem(itemName)) {
            pk = store.getItem(itemName) + value;
            return {
                pk: pk,
                param: '?pk=' + pk,
                table: table,
                rc: true
            }
        } else {
            paramOnFailure("Please reselect"+ itemName);
            return { rc: false }
        }
}

答案 3 :(得分:0)

我最初没有滚动完成,所以我错过了很多switch语句(在其他一些答案中也可能是这种情况)。前两种情况很容易将其分解为函数。在其余代码中,您有更多的差异,因此您需要在该函数中使用更多参数,这很容易让人感到困惑。

相反,您可以使用configuration object来命名选项并使用默认值(用于合并默认值和给定值,请参阅.extend()merging objects dynamically)。您还可以从所有必需值动态构建错误消息。它应该变得更短,更可读。

一些伪代码:

// Pseudo-Code
function getParams(entity) {
 var store = window.localStorage;
 var defaults = {
    "mandatoryValues":[],
    "pk":null,
    "table":"Content",
    "errorMessage":"Please reselect Account",
    "param":""
 };
 var foo = function(cfgObj) {
    // Add default values from defaults variable for missing properties in cfgObj
    // Set other missing values based on cfgObj (e.g. `param` from `pk`)
    // Return your object using the now 'complete' cfgObj
 }

 switch (entity) {
    case "City":
        var pk = store.getItem('AccountID') + "04" + "000";
        return foo(
            "mandatoryValues":[store.getItem('AccountID')],
            "pk":pk);
    // Menu, Page
    case "Question":
        var pk = store.getItem('AccountID') + store.getItem('CityID');
        return foo(
            "mandatoryValues":[
                store.getItem('AccountID'),
                store.getItem('CityID'),
                store.getItem('TopicID')],
            "pk":pk,
            "param":'?pk=' + pk + '&rk=' + store.getItem('TopicID'),
            "table":"Question");
    // Reference, Topic, default
}