解析时减少代码重复

时间:2016-06-20 10:50:35

标签: regex node.js optimization code-duplication

我更喜欢在我的代码库中尽可能少地重复代码,因此我一直在寻找降低代码的方法。

然而,我对以下案件有点困惑: 假设我有一个方法将一个程序的输出解析为一个对象,使其在另一个程序中可读。

我目前的方法是使用正则表达式扫描输入以形成输出的新对象。

这会创建一个很长的if语句列表,这些语句看起来或多或少相同,并且有轻微的变化。是否有一种有意义的方法来减少代码重复,或者这是我必须要忍受的事情?

if ((match = block.match(/bssid=([A-Fa-f0-9:]{17})/))) {
    parsed.bssid = match[1].toLowerCase();
}

if ((match = block.match(/freq=([0-9]+)/))) {
    parsed.frequency = parseInt(match[1], 10);
}

if ((match = block.match(/mode=([^\s]+)/))) {
    parsed.mode = match[1];
}

if ((match = block.match(/key_mgmt=([^\s]+)/))) {
    parsed.key_mgmt = match[1].toLowerCase();
}

1 个答案:

答案 0 :(得分:3)

我猜你想要这样的东西:

var parseConfig = {
    bssid: {
        expr: /bssid=([A-Fa-f0-9:]{17})/,
        handle: match => match[1].toLowerCase()
    },
    frequency: {
        expr: /freq=([0-9]+)/,
        handle: match => parseInt(match[1], 10)
    },
    mode: {
        expr: /mode=([^\s]+)/,
        handle: match => match[1]
    },
    key_mgmt: {
        expr: /key_mgmt=([^\s]+)/,
        handle: match => match[1].toLowerCase()
    }
};

function parse(block, cfg) {
    var parsed = {};

    Object.keys(cfg).forEach(key => {
        var item = cfg[key],
            match = block.match(item.expr);

        parsed[key] = match ? item.handle(match) : null;
    });

    return parsed;
}