我有以下代码。它看起来漫长而复杂,现在我必须添加更多条件。有什么方法可以简化这段代码。我能想到的只是组合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:
;
}
答案 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
}