Home > Back-end >  Newbie question: my function variables aren't changing
Newbie question: my function variables aren't changing

Time:05-31

I have a function for verifying and possibly modifying postal codes from a test file. It verifies correct string length, that there's a space in the middle of the 6 characters (& if not, to insert one), etc. My regExp test is working, but my trim() and toUppercase() methods aren't applying.

function fixPostalCode(postalCode) {
    var invalidChars = new RegExp(/([ABCEGHJKLMNPRSTVXY]\d)([ABCEGHJKLMNPRSTVWXYZ]\d){2}/i);
    postalCode = postalCode.toString().trim(); //**trim isn't working**
    if (postalCode.charAt(3) !== ' ') {
        postalCode = postalCode.slice(0, 3)   ' '   postalCode.slice(3, 6);
        
    }
    if (invalidChars.test(postalCode.toString())) {
        return postalCode.toUpperCase(); //**toUppercase isn't working**
    }
    else {
        throw 'Invalid postal code';
    }
}

I'm using Jest to run a series of tests, for instance:

test('trailing space is removed', function () {
    const postalCode = 'A1A 1A1   ';
    expect(fixPostalCode(postalCode)).toEqual('A1A 1A1');
  }); 

It tests each of the aforementioned conditions and gives a pass or fail. My code is throwing at this test, and for converting to uppercase, as well as the space not being added in the middle. I think I'm not understand how block scope works in JS but nothing I'm doing is helping.

CodePudding user response:

trim() removes whitespace from both sides of a string not from the middle of string. As I see from your description you are trying to cancel whitespace in the middle of the string which is not possible with trim. You should use replace

function fixPostalCode(postalCode) {
    let test1 = postalCode.toString().trim();
    console.log(test1) ///It will fail
    let test2 = postalCode.replace(/  /g, "");
    console.log(test2) ///It will be succesfull
}

fixPostalCode('A1A 1A1');

CodePudding user response:

You're most of the way there, but the order of your space insertion wasn't being picked up by the later Regex as valid. Without changing the regex, your code is functional by swapping the order of your toUpperCase method with the space insertion via slice:

function fixPostalCode(postalCode) {
  var invalidChars = new RegExp(/([ABCEGHJKLMNPRSTVXY]\d)([ABCEGHJKLMNPRSTVWXYZ]\d){2}/i);
  postalCode = postalCode.toString().trim();

  if (invalidChars.test(postalCode.toString())) {
    postalCode = postalCode.toUpperCase();
  }

  if (postalCode.charAt(3) !== ' ') {
    return postalCode.slice(0, 3)   ' '   postalCode.slice(3, 6);
  } else {
    throw 'Invalid postal code';
  }
}

  • Related