如何组合类似的函数-Javascript

如何组合类似的函数-Javascript,javascript,Javascript,我有两个非常相似的功能,如果可能的话,我想将它们结合起来。我唯一的问题是一个函数接受2个参数,另一个函数接受3个参数。有没有办法做到这一点,或者这两个功能必须通过设计保持分离 function getClientData(id, command) { var formData = { 'method': command, 'id': id }; getEntityData(formData); } function getLocat

我有两个非常相似的功能,如果可能的话,我想将它们结合起来。我唯一的问题是一个函数接受2个参数,另一个函数接受3个参数。有没有办法做到这一点,或者这两个功能必须通过设计保持分离

function getClientData(id, command) {

    var formData = {
        'method': command,
        'id': id
    };

    getEntityData(formData);
}


function getLocation(id, clientid, command) {

    var formData = {
        'method': command,
        'locationid': id,
        'clientbrandid': clientid
    };

    getEntityData(formData);
}
更新

function getEntityData(data) {

    var url = '/../admin/miscellaneous/components/global.cfc?wsdl';

    var ajaxResponse = $.ajax({
        url: url,
        dataType: 'json',
        data: data,
        global: false,
        async:false,
        cache: false,
        success: function(apiResponse){
            return apiResponse;
        }
    }).responseJSON;

    var response = ajaxResponse[0];

    for (var i in response) {
        if (response.hasOwnProperty(i)){
            $("#edit"+i).val(response[i].trim());
        }
    }
}
也许是更合理的论点顺序:

function getLocation(id, command, clientid) {
    var formData = {
        'method': command,
        'locationid': id
    };

    if (clientid) {
        formData['clientbrandid'] = clientid;
    }

    getEntityData(formData);
}

// With
getLocation(1, 'doStuff', 2);

// Without
getLocation(1, 'doStuff');
如果
locationid
id
不同:

function getLocation(id, command, clientid) {
    if (clientid) {
        var formData = {
            'method': command,
            'locationid': id,
            'clientbrandid': clientid
        };
    } else {
        var formData = {
            'method': command,
            'id': id,
        };
    }

    getEntityData(formData);
}

// With
getLocation(1, 'doStuff', 2);

// Without
getLocation(1, 'doStuff');

是的,您可以,我宁愿不传递每个参数,而是传递一个js对象,并决定它包含哪些参数,例如:

function getLocation(options) {

    getEntityData(options);
}
你的电话应该是:

getLocation({'method': command,'id': id})
更新

function getEntityData(data) {

    var url = '/../admin/miscellaneous/components/global.cfc?wsdl';

    var ajaxResponse = $.ajax({
        url: url,
        dataType: 'json',
        data: data,
        global: false,
        async:false,
        cache: false,
        success: function(apiResponse){
            return apiResponse;
        }
    }).responseJSON;

    var response = ajaxResponse[0];

    for (var i in response) {
        if (response.hasOwnProperty(i)){
            $("#edit"+i).val(response[i].trim());
        }
    }
}
或者您可以避免使用getLocation函数,只调用getEntityData

getEntityData({
    'method': command,
    'id': id
});

我想这取决于你的论点,但这也是一个解决方案。(假设客户端id是一个对象)

我同意:

function getWhatever(id, command, clientId) {
    var formData = { method: command };

    if (typeof clientId === 'undefined') {
        formData.id = id;
    } else {
        formData.locationid = id;
        formData.clientbrandid = clientId;
    }

    getEntityData(formData);
}

这看起来棒极了。我会试试看,让你知道!!在这一点上,拥有
getLocation
函数是没有用的,不是吗?他可以直接调用
getEntityData
,这也是我的想法@ColinDeClue。感谢您的更新:)请注意,如果您是在一个现有的代码库中执行此操作,并且该代码库积极地使用这些函数,那么函数签名(参数的顺序是不同的)。您需要重构现有代码。最好将可选参数设置为最后一个,这样就不需要删除它。这不应该是
'clientbrandid':\u clientid
?否则它只是一个未使用的变量,对吗?实际上您有4个参数,id和locationid以不同的名称传递给getEntityData。它们是一样的吗?您尚未显示getEntityData的功能。我将立即更新。getEntityData只是一个ajax函数,它接受
data:
部分中的数据。
function getWhatever(id, command, clientId) {
    var formData = { method: command };

    if (typeof clientId === 'undefined') {
        formData.id = id;
    } else {
        formData.locationid = id;
        formData.clientbrandid = clientId;
    }

    getEntityData(formData);
}