我有一个带有多个嵌套开关大小写的JavaScript函数,这完全是一团糟。该功能在过去几个月中得到了扩展,现在我想重组代码。 在每种情况下,都应将一个不同的值推送到一个已经存在的变量中。
这是我的代码示例:
switch(var1){
case 1:
switch(var2){
case 0:
switch(var3){
case 'test':
switch(i){
case 0: endresult.push({id: i, content: '123'}); break;
case 2: endresult.push({id: i, content: '124'}); break;
}
break;
default:
endresult.push({id: i, content: '125'}); break;
}
break;
case 1:
endresult.push({id: i, content: '126'}); break;
}
break;
case 2:
switch(var2){
case 0:
switch(i){
case 0: endresult.push({id: i, content: '127'}); break;
case 2: endresult.push({id: i, content: '128'}); break;
}
break;
case 1:
switch(i){
case 0: endresult.push({id: i, content: '128'}); break;
case 2: endresult.push({id: i, content: '129'}); break;
}
break;
}
break;
}
重写此内容的最佳方法是什么?
答案 0 :(得分:3)
具有所有可能的变化及其值的地图:
// Key is composite of `"" + var1 + "_" + var2 + "_" + i` and trimmed `_` from back
let tree = {
'1_0_test_0': '123',
'1_0_test_2': '124',
'1_0_test': '125',
'1_0_1': '126',
...
}
let key = ("" + var1 + var2 + i).replace(/_{2,}|_+$/, '');
if (typeof tree[key] !== 'undefined') {
endresult.push({id: i, content: tree[key]});
}
答案 1 :(得分:1)
您关心的是可读性吗?您可能需要稍微拆分一下代码。并使用变量名代替0和1。此外,您还需要提供更多详细信息。像它可以超越0和1到2和3等等等。我不确定您如何调用代码。
但是,您可以尝试(将对象和if-else混合使用):
const decideFn = ({ var1, var2, var3, i }) = {
const decision = {
1: {
0: {
cond(i) {
if (var3 === 'test') {
if (i === 0)
endresult.push({id: i, content: '123'})
else if (i === 2)
endresult.push({id: i, content: '124'})
else
endresult.push({id: i, content: '125'})
}
else endresult.push({id: i, content: '125'})
}
},
1: {
cond(i) {
endresult.push({id: i, content: '126'})
}
}
}
2: {
0: {
cond(i) {
if (i === 0)
endresult.push({id: i, content: '127'})
else if (i === 2)
endresult.push({id: i, content: '128'})}
},
1: {
cond(i) {
if (i === 0)
endresult.push({id: i, content: '128'})
else if (i === 2)
endresult.push({id: i, content: '129'})
}
}
}
}
// usage
// does i go in a loop ?
// your qn needs more details. but i hope you get the idea
decision[var1][var2].cond(i)
}
最终,它确实可以归结为您如何最佳地理解代码以及其他开发人员将如何阅读您的代码,但就我个人而言,我认为您的switch语句很好。
对象可能会提供更多的灵活性。
答案 2 :(得分:0)
如果在每种情况下都使用同一个变量,我会考虑创建一个函数,其唯一的工作就是根据变量确定正确的值。
这可能看起来像这样:
const getContentValue(var1, var2, var3, i) {
if (var1 === 1) {
if (var2 === 0) {
if (var3 === 'test') {
if (i === 0) return '123'
if (i === 2) return '124'
return '125'
}
if (var2 === 1) {
return '126'
}
}
if (var1 === 2) {
if (var2 === 0) {
if (i === 0) return '127'
if (i === 2) return '128'
}
if (var2 === 1) {
if (i === 0) return '128'
if (i === 2) return '129'
}
}
}
endResult.push({ id: i, content: getContentValue(var1, var2, var3, i) })
(代码未经测试。)
需要注意的几件事和要删除的一些原则:
if
语句进行了简化。在我看来,在多个案例之间切换是您在有很多案例时要做的事情,而不是在两件事之间切换。当您在两个选项之间切换时,if
语句非常有用。如果您确实在处理大量案例,则说您的var1实际上可能是10多个不同的数字,使用switch
可能更简单。switch
语句,那么每种情况都有很多相同之处。一种技巧是查看每种情况下答案的变化。 i
是相同的。只有数字改变。这是一条简化事情的好方法。switch
语句和if
语句在概念上的相似之处。在函数中,如果有return语句,它将像break
语句的switch
一样工作。如果您要在每个if
案例之后返回,则当您有足够的信息知道要返回的内容时,将相当于default
案例。 (例如,请参见显示return '125'
的行。我们知道,如果到此为止,应该返回125。)