Search code examples
node.jssonarqube

Refactor this function


Received sonar issue for refactoring below function. Any way to refactor below function.

function getBodyFields(request:UpdateCustomerRequest, tmsGuid:string) {
  return {
    tmsGuid: tmsGuid,
    ...((request.organizationName && request.organizationName !== "") && {'organizationName': request.organizationName}),
    ...((request.firstName && request.firstName !== "") && {'firstName': request.firstName}),
    ...((request.middleInitial && request.middleInitial !== "") && {'middleInitial': request.middleInitial}),
    ...((request.lastName && request.lastName !== "") && {'lastName': request.lastName}),
    ...((request.email && request.email !== "") && {'email': request.email}),
    ...((request.communicationEmail && request.communicationEmail !== "") && {'communicationEmail': request.communicationEmail}),
    ...((request.areaCode && request.areaCode !== "") && {'areaCode': request.areaCode}),
    ...((request.phoneNumber && request.phoneNumber !== "") && {'phoneNumber': request.phoneNumber}),
    ...((request.phoneType && request.phoneType !== "") && {'phoneType': request.phoneType}),
    ...((request.alternatePhoneAreaCode && request.alternatePhoneAreaCode !== "") && {'alternatePhoneAreaCode': request.alternatePhoneAreaCode}),
    ...((request.alternatePhoneNumber && request.alternatePhoneNumber !== "") && {'alternatePhoneNumber': request.alternatePhoneNumber}),
    ...((request.alternatePhoneType && request.alternatePhoneType !== "") && {'alternatePhoneType': request.alternatePhoneType}),
    ...((request.address1 && request.address1 !== "") && {'address1': request.address1}),
    ...((request.address2 && request.address2 !== "") && {'address2': request.address2}),
    ...((request.city && request.city !== "") && {'city': request.city}),
    ...((request.state && request.state !== "") && {'state': request.state}),
    ...((request.zip && request.zip !== "") && {'zip': request.zip}),
  }
}

Solution

  • You could use a loop since you test all the props the same way.

    const props = [
        'organizationName',
        'firstName',
        'middleInitial',
        'lastName',
        'email',
        'communicationEmail',
        'areaCode',
        'phoneNumber',
        'phoneType',
        'alternatePhoneAreaCode',
        'alternatePhoneNumber',
        'alternatePhoneType',
        'address1',
        'address2',
        'city',
        'state',
        'zip'
    ];
    
    function getBodyFields(request:UpdateCustomerRequest, tmsGuid:string) {
        var obj = {
            tmsGuid: tmsGuid
        };
        props.forEach(p => {
            if (typeof request[p] === 'string' && request[p] !== '')
                obj[p] = request[p];
        });
        return obj;
    }
    

    It's better to check if the value is string since your check request.zip && request.zip !== "" will return true even if the zip is true or 1 or [1] or any truthy value.