Credit Card Checker - Avoid Mutating Array (JavaScript)

Hey folks, I’m working on the Credit Card Checker project after learning how to work with arrays and loops in JavaScript.

This project has been a really great brain-wrinkle so far and I’ve enjoyed challenging myself to complete each step and resolve errors/debug on my own.

However, I’m really stuck on figuring out how to avoid mutating the original array with my current solution for the validateCred function.

I’ve noticed that when I call validateCred() with the five mystery arrays as arguments, 3 of them come back as false, and the rest are true. This seems to be as intended by the creator of this project.

However, if I first call findInvalidCards() and then call validateCred() on the same five mystery arrays, the results change. All of the mystery arrays are now coming back as invalid:

Can anyone help explain to me what’s actually happening here? Am I somehow mutating the array even though I created a copy array within my function to try to avoid doing that? I’m not looking for someone to tell me how to rewrite my code, necessarily, but I do want to get a better understanding of why this is happening. Thank you!!!

Here’s my code:

// All valid credit card numbers
const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8];
const valid2 = [5, 5, 3, 5, 7, 6, 6, 7, 6, 8, 7, 5, 1, 4, 3, 9];
const valid3 = [3, 7, 1, 6, 1, 2, 0, 1, 9, 9, 8, 5, 2, 3, 6];
const valid4 = [6, 0, 1, 1, 1, 4, 4, 3, 4, 0, 6, 8, 2, 9, 0, 5];
const valid5 = [4, 5, 3, 9, 4, 0, 4, 9, 6, 7, 8, 6, 9, 6, 6, 6];

// All invalid credit card numbers
const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5];
const invalid2 = [5, 7, 9, 5, 5, 9, 3, 3, 9, 2, 1, 3, 4, 6, 4, 3];
const invalid3 = [3, 7, 5, 7, 9, 6, 0, 8, 4, 4, 5, 9, 9, 1, 4];
const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5];
const invalid5 = [5, 3, 8, 2, 0, 1, 9, 7, 7, 2, 8, 8, 3, 8, 5, 4];

// Can be either valid or invalid
const mystery1 = [3, 4, 4, 8, 0, 1, 9, 6, 8, 3, 0, 5, 4, 1, 4];
const mystery2 = [5, 4, 6, 6, 1, 0, 0, 8, 6, 1, 6, 2, 0, 2, 3, 9];
const mystery3 = [6, 0, 1, 1, 3, 7, 7, 0, 2, 0, 9, 6, 2, 6, 5, 6, 2, 0, 3];
const mystery4 = [4, 9, 2, 9, 8, 7, 7, 1, 6, 9, 2, 1, 7, 0, 9, 3];
const mystery5 = [4, 9, 1, 3, 5, 4, 0, 4, 6, 3, 0, 7, 2, 5, 2, 3];

// An array of all the arrays above
const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, mystery1, mystery2, mystery3, mystery4, mystery5];


// Add your functions below:
function validateCred(arr) {
    let newArr = arr; 
    for (let i = (newArr.length - 2); i >= 0; i = i - 2) {
    newArr[i] = newArr[i] * 2; 
    if (newArr[i] > 9) {
        newArr[i] = newArr[i] - 9;
      } 
    }
  let arraySum = newArr.reduce((acc, num) => acc + num); 
  if (arraySum % 10 === 0) {
    return true  
  } else {return false}
}


function findInvalidCards(arr) {
  let invalidArray = [];
  for (let i = 0; i <= arr.length - 1; i = i + 1) {
    if (!validateCred(arr[i])) {
      invalidArray.push(arr[i]);
    }
  }
  return invalidArray; 
}

here:

let newArr = arr; 

you don’t make a copy of your array. We simple have another variable pointing to the same array in memory.

You can give multiple people the address of your house (variables), yet there is only house (array)

1 Like

Thank you!

I tried doing this instead:

newArray  = arr.slice();

and the function seemed to perform as desired without mutating the original array.