在javascript中将if-else从静态更改为动态

在javascript中将if-else从静态更改为动态,javascript,if-statement,Javascript,If Statement,我有一个if-else条件,如果我上传一个文件,它将看到文件名中的“code name”,即“abc1”,并将其与硬编码值进行比较,然后将返回值与ProductLine进行比较。这里我正在做一个双向搜索。如何摆脱所有这些if-Else,让它变得简单,就像我上传了一个文件,将它与productLine进行比较,然后返回一样。下面是代码 var findProductLineByFilename = function(filename, productLines) { filenam

我有一个if-else条件,如果我上传一个文件,它将看到文件名中的“code name”,即“abc1”,并将其与硬编码值进行比较,然后将返回值与ProductLine进行比较。这里我正在做一个双向搜索。如何摆脱所有这些if-Else,让它变得简单,就像我上传了一个文件,将它与productLine进行比较,然后返回一样。下面是代码

    var findProductLineByFilename = function(filename, productLines) {
    filename = filename.replace(/( |\-|\.|_)/g, '');
    var i;
    for (i in productLines) {
        productLine = productLines[i];

        // XXX: Hard-code names
        if (productLine.code_name === 'abc1') {
            if (filename.search(/(war1)|(w1)|(abc1)/) >= 0) {
                return productLine;
            }
        } else if (productLine.code_name == 'abc2') {
            if (filename.search(/(w2)|(abc2)/) >= 0) {
                return productLine;
            }
        } else if (productLine.code_name == 'abc3') {
            if (filename.search(/(w3)|(abc3)/) >= 0) {
                return productLine;
            }
        } else if (productLine.code_name == 'abc4') {
            if (filename.search(/(w4)|(abc4)/) >= 0) {
                return productLine;
            }
        } else if (productLine.code_name == 'abc5') {
            if (filename.search(/(w5)|(abc5)/) >= 0) {
                return productLine;
            }
        }
    }
    return null;
};

使用对象将代码名映射到正则表达式

var findProductLineByFilename = function(filename, productLines) {
    filename = filename.replace(/( |\-|\.|_)/g, '');
    var map = {
        'abc1': /(war1)|(w1)|(abc1)/,
        'abc2': //(w2)|(abc2)/,
        ...
    };
    var i;
    for (var i = 0; i < productLines.length; i++) {
        productLine = productLines[i];
        if (productLine.code_name in map && map[productLine.code_name].test(filename)) {
            return productLine;
        }
    }
    return null;
};

替代方案来自哪里?我们可以看到abcN来自代码名,但是wN部分呢?我在这里尝试的是摆脱硬编码。我的意思是使用对象映射仍然是硬编码。productLine应该直接来自产品列表,我不知道怎么做。如何知道code_name=='acb1'与文件名中的war1、w1和acb1相关,而code_name='acb2'仅与w2和acb2相关。所有的测试似乎没有一个共同的模式。我不确定你说的直接来自产品列表是什么意思。产品清单是什么?