重构只能通过条件和返回值区分的JavaScript函数

时间:2014-07-03 11:20:11

标签: javascript jquery

目前我有3个非常相似的功能。它们仅区分输入参数名称,条件和返回值。我要重构它们,我想你们可能会告诉我你认为重构这些的最佳方法是什么。感觉像必须有1个函数,但名称可以理解,条件应作为函数传递给参数或类似的东西。

function getFieldName(fieldName) {
    var dataSet = getDataSet();

    var dataFields = dataSet.DataFields;
    for (var i = 0; i < dataFields.length; i++) {
        if (dataFields[i].FieldName.toLowerCase() === fieldName.toLowerCase()) {
            return dataFields[i].FieldName;
        }
    }
    return null;
};


function getFieldNameByDisplayName(displayName) {
    var dataSet = getDataSet();

    var dataFields = dataSet.DataFields;
    for (var i = 0; i < dataFields.length; i++) {
        if (dataFields[i].DisplayName.toLowerCase() === displayName.toLowerCase()) {
            return dataFields[i].FieldName;
        }
    }

    return null;
};


function getDisplayNameByFieldName(fieldName) {
    var dataSet = getDataSet();

    var dataFields = dataSet.DataFields;
    for (var i = 0; i < dataFields.length; i++) {
        if (dataFields[i].FieldName.toLowerCase() === fieldName.toLowerCase()) {
            return dataFields[i].DisplayName;
        }
    }

    return null;
};
你怎么看?谢谢。

====================================

  

更新:可能是这样的:

function getFieldName(fieldName, compareFieldProperty, returnFieldProperty) {
    var dataSet = getDataSet();

    var dataFields = dataSet.DataFields;
    for (var i = 0; i < dataFields.length; i++) {
        if (dataFields[i][compareFieldProperty].toLowerCase() === fieldName.toLowerCase()) {
            return dataFields[i][returnFieldProperty];
        }
    }

    return null;
};

2 个答案:

答案 0 :(得分:1)

这样的东西?

function getFieldName(type, name) {
    var dataSet = getDataSet();

    var dataFields = dataSet.DataFields;
    for (var i = 0; i < dataFields.length; i++) {
        if (dataFields[i][type].toLowerCase() === name.toLowerCase()) {
            return dataFields[i][type];
        }
    }
    return null;
};

答案 1 :(得分:1)

好吧,您可以使用dynamic property accessor并将属性名称作为参数传递:

function getAbyB(a, b, bvalue) {
    var dataFields = getDataSet().DataFields;
    for (var i = 0; i < dataFields.length; i++) {
        if (dataFields[i][b].toLowerCase() === bvalue.toLowerCase()) {
            return dataFields[i][a];
        }
    }
    return null;
};


function getFieldName(fieldName) {
    return getAbyB("FieldName", "FieldName", fieldName);
}
function getFieldNameByDisplayName(displayName) {
    return getAbyB("FieldName", "DisplayName", displayName);
}
function getDisplayNameByFieldName(fieldName) {
    return getAbyB("DisplayName", "FieldName", fieldName);
}