Javascript 如何基于参数以更高效、更好的方式分析数据库表中的字符串?
我有两个数据库,它们连接到两个不同的后端应用程序服务器。两个服务器都与一个web应用程序通信。现在,您可以简单地更改UI上的url参数,以选择与哪个服务通信,即,如果您设置Javascript 如何基于参数以更高效、更好的方式分析数据库表中的字符串?,javascript,typescript,architecture,Javascript,Typescript,Architecture,我有两个数据库,它们连接到两个不同的后端应用程序服务器。两个服务器都与一个web应用程序通信。现在,您可以简单地更改UI上的url参数,以选择与哪个服务通信,即,如果您设置serverUrl='abc',它将指向servera和数据库a,如果您设置serverUrl='cde',它将指向服务器B和数据库B。我在前端进行了工作流测试,这两种服务基本上都是通用的。但是db A和db B中的字段名不同。i、 例如,假设我在db a中有一个名为“webid”的字段名,那么在db B中相同的字段名被称为“
serverUrl='abc'
,它将指向servera
和数据库a
,如果您设置serverUrl='cde'
,它将指向服务器B
和数据库B
。我在前端进行了工作流测试,这两种服务基本上都是通用的。但是db A
和db B
中的字段名不同。i、 例如,假设我在db a
中有一个名为“webid”的字段名,那么在db B
中相同的字段名被称为“webid
”,类似地,在db a
中有更像“code
”的字段名。因此,我没有重复我的测试,而是简单地创建了一个函数,在这个函数中,我只需根据serverUrl进行检查,如果它是db a
,则返回“code”,否则返回“code
”,依此类推数据库中的所有字段名。因此,在我的测试中,不是简单地用普通的字段名创建查询,而是传入checkField(“code”)
,它根据条件返回一个字符串(serverUrl
)并执行查询
功能如下:
function checkField(str: string) : string {
let server = serverUrl === 'abc' ? true : false;
switch (args[0].toLowerCase()) {
case 'code':
return serverUrl ? 'code' : 'CODE';
case 'webid':
return serverUrl ? 'webid' : 'Webid';
case 'pkid':
return serverUrl ? 'pkid' : 'PkId';
case 'barcode':
return serverUrl ? 'barcode' : 'Barcode';
case 'price':
return serverUrl ? 'price' : 'Price';
case 'bestbefore':
return serverUrl ? 'bestbefore' : 'BestBefore';
case 'produce':
return serverUrl ? 'produce' : 'Produce';
case 'sales':
return serverUrl ? 'sales' : 'Sales';
case 'marketid':
return serverUrl ? "marketid" : "MarketId";
case 'regdate':
return serverUrl ? "regdate" : "Regdate"; //and more fields
default:
return args[0];
}
所以,我想知道是否有更优雅的方式来进行这种比较。我们可以在这里使用静态代码分析器吗?[我不确定它们是什么]任何见解或指针都很好。
非常感谢。当服务器URL
是真实的时,您根本不需要开关
——您总是返回打开的相同值。因此,不要在每个开关情况下进行测试,而是在测试之前进行一次:
function checkField(str: string) : string {
if (serverUrl === 'abc')
return str.toLowerCase();
else
switch (str.toLowerCase()) {
case 'code': return 'CODE';
case 'webid': return 'Webid';
case 'pkid': return 'PkId';
case 'barcode': return 'Barcode';
case 'price': return 'Price';
case 'bestbefore': return 'BestBefore';
case 'produce': return 'Produce';
case 'sales': return 'Sales';
case 'marketid': return "MarketId";
case 'regdate': return "Regdate";
//and more fields
default: return str;
}
}
您也可以使用对象文字或作为查找表,而不是switch
语句。借用@Bergi的答案,我将创建一个映射对象,使其更清晰。例如:
function checkField(str: string) : string {
//create a mapping
var myMapping = {
'code' : 'CODE',
'webid' : 'Webid',
'pkid' : 'PkId',
'barcode': 'Barcode',
//and more fields
}
if (serverUrl === 'abc') {
return str.toLowerCase();
} else {
return myMapping[str.toLowerCase()] || str;
}
}
这使逻辑与映射更加分离,因此我觉得它更清晰。但这是个人偏好。您可以将所有值放在地图中
function checkField(String str) {
let map = new Map([["code", "CODE"], ["webid", "Webid"]]);
if (serverUrl === 'abc')
return str.toLowerCase();
else
return map[str]
}
您是指这些ternaries中的布尔值服务器
,而不是服务器URL
?还有什么是args[0]
,你的意思是str
?我可能会使用硬编码的对象,这样你就可以使用fieldnames['serverA']['bestbefore']
等符号。简单的查找感觉不太容易。你不需要使用map.get(str)代码>?我注意到有些情况下,大小写
字符串与两个值都不匹配。i、 例如,case“mode”:返回serverUrlx':'y'
。我如何处理这些案件?此时,简单映射的实现失败了。请帮忙。我不知道我是否可以用一种不同的方式,而不是硬编码值。实际上,我不想使用checkField()
方法。你认为,在不实现该方法的情况下,我可以用任何其他方式来实现吗?在这种情况下,我会使用两个单独的映射/切换语句,一个表示serverUrl
为true,另一个表示not。“我实际上不想使用checkField()方法。”-wat?整个问题只是关于那个方法。我认为不维护应用程序名称、数据库1名称和数据库2名称之间的映射是不可能的。不过,您可能想了解更多关于这些数据库和访问它的应用程序的详细信息,也可能是在。