Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何基于参数以更高效、更好的方式分析数据库表中的字符串?_Javascript_Typescript_Architecture - Fatal编程技术网

Javascript 如何基于参数以更高效、更好的方式分析数据库表中的字符串?

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中相同的字段名被称为“

我有两个数据库,它们连接到两个不同的后端应用程序服务器。两个服务器都与一个web应用程序通信。现在,您可以简单地更改UI上的url参数,以选择与哪个服务通信,即,如果您设置
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名称之间的映射是不可能的。不过,您可能想了解更多关于这些数据库和访问它的应用程序的详细信息,也可能是在。