重构仅根据条件和返回值进行区分的JavaScript函数

Refactoring JavaScript functions that differentiate only by condition and return value

本文关键字:行区 JavaScript 函数 返回值 条件 重构      更新时间:2023-09-26

目前我有3个非常相似的函数。它们仅在输入参数名称、条件和返回值方面有所区别。我要重构它们,我想你们可能会告诉我,在你们看来重构它们的最佳方式是什么。感觉必须有一个函数,但有一个可理解的名称,并且条件应该作为函数的参数或类似的东西传递。

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;
};

那么,您可以使用动态属性访问器并将属性名称作为参数传递:

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);
}

像这样?

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;
};