Credit Card Checker code question

Hey everybody!

So I’m working on the Credit Card Checker project at the moment and just “finished” task number 4.

// 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:
const validateCard = array => {
  for (let i = array.length - 2; i>=0; i-=2){
    let doubleNumber = array[i]* 2;
    if (doubleNumber > 9){
      array[i] = doubleNumber - 9;
    }else {
       array[i] = doubleNumber;
    }
  }
  let sum = 0;
for(let i = 0; i < array.length; i++)
{
    sum = sum + array[i];
}
if (sum % 10 === 0){
   return true;
}else {
   return false;
}
}

const findInvalidCards = nestedArray => {

const invalidCards = [];
for (let i = 0; i < nestedArray.length; i++){
  let cards = nestedArray[i];
  if (validateCard(cards)== false){
    invalidCards.push(cards);
  }
}
return invalidCards;
}
console.log(findInvalidCards(batch));

I’ve tested the “batch” array with the findInvalidCards() function and got the following list:
credit cards

Then, just to make sure everything was working fine, I tested every single array with the validateCard() function. The 4th array, highlighted on the console ([ 3, 0, 2, 1, 2, 2, 5, 9, 3, 1, 5, 7, 5, 9, 6, 5 ]), returns true instead of false like the other ones…
Now, how could that be?
I’ve reviewed my code over and over but can’t seem to find the error…
Any ideas?

I think its because doing your validateCard function changes the contents of the array.
Note that printing out any of the arrays after doing validateCard or any other function that calls validateCard thus changes what’s in the array that represents each card.

One way to solve this problem is to do all the stuff in validateCard on a copy of the array instead of the original array.
I used something like

function validateCard(card) {
  let array = Array.from(card);

to start the function
by making a copy of the array that goes into the function

but there are many other ways to do that too.

I took the following from your code, to demonstrate that your function changes what’s in the array.

const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5]; console.log(invalid4); const validateCard = array => { for (let i = array.length - 2; i>=0; i-=2){ let doubleNumber = array[i]* 2; if (doubleNumber > 9){ array[i] = doubleNumber - 9; } else { array[i] = doubleNumber; } } let sum = 0; for(let i = 0; i < array.length; i++) { sum = sum + array[i]; } if (sum % 10 === 0){ return true; }else { return false; } } console.log(validateCard(invalid4)); console.log(invalid4);
1 Like

That was exactly it! I’ve tested all the arrays again and this time all of them returned false, thanks for your help mate!