Javascript credit card checker help!

Hello,
I am stuck on the credit card checker project please help. The directions and my code is below. Whenever i check valid credit cards it is logging false to the console, but it should be true. Thanks in advance.

Create a function, validateCred() that has a parameter of an array. The purpose of validateCred() is to return true when an array contains digits of a valid credit card number and false when it is invalid. This function should NOT mutate the values of the original array.

To find out if a credit card number is valid or not, use the Luhn algorithm. Generally speaking, an algorithm is a series of steps that solve a problem — the Luhn algorithm is a series of mathematical calculations used to validate certain identification numbers, e.g. credit card numbers. The calculations in the Luhn algorithm can be broken down as the following steps:

  1. Starting from the farthest digit to the right, AKA the check digit, iterate to the left.
  2. As you iterate to the left, every other digit is doubled (the check digit is not doubled). If the number is greater than 9 after doubling, subtract 9 from its value.
  3. Sum up all the digits in the credit card number.
  4. If the sum modulo 10 is 0 (if the sum divided by 10 has a remainder of 0 ) then the number is valid, otherwise, it’s invalid.
//My current code

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 validateCred = arr => {
  
  for (let i = arr.length-2; i >= 0; i-= 2) {
  arr[i] = (arr[i] * 2) % 9 
  }
  for (let i = 0; i < arr.length; i++) {
    let total = 0;
    total += arr[i];
    if (total % 10 === 0) {
      return true;
    } else {
      return false;
    }
  }
}

console.log(validateCred(valid1))

Hi!

From what I can tell your first loop is changing the original array by first multiplying every element by 2 and the only keeping the remainder of 9. The algorithm for the credit cards should only multiply every other element and subtract 9 from the element if it is greater than 9. Right now you are multiplying every element (except the last one) by two, and then you are dividing by 9 and storing the remainder. This means you are also mutating the original array and have lost the original credit card number! I think this is were your problem is.

Also I would be cautious in declaring local variables inside your for loop and also using the if (total % 10 === 0) inside the loop. This means that every time you run the loop it will check if this is true, also it will reset the total to 0 everytime you run the loop. Which means that the if is always evaluated to false.

PS. Not all credit card numbers are the same length in the arrays, which means that it might not work to just do multiply every other index in the for loop :wink:

Hope that helps!

Kind regards,
Martin

Hi Martin,
thank you for your reply.
I have changed some things around and i get true on valid1 and valid4. do you happen to know why all of then are not returning valid

const validateCred = arr => {
let total = 0;
for (let i = arr.length-2; i >= 0; i–) {
if (i % 2 === 0) {
arr[i] * 2
} else if (arr[i] > 9) {
arr[i] % 9
} else {
arr[i]
}
total += arr[i];
if (total % 10 === 0) {
return true;
} else if (!total % 10 === 0) {
return false;
}
}

}

Good job!

I would change so arr[i] gets stored in a variable and change the variable with every loop and then add it to total.

I would also try move the if (total % 10 === 0) outside of the for-loop.

Good luck!

Thank you for your help!!

Did what you said also had to equal the new variable.
const validateCred = arr => {
let total = 0;
for (let i = arr.length-1; i >= 0; i–) {
let value = arr[i];
if (i % 2 === 0) {
value *= 2
if (value > 9) {
value -= 9
}

}
total += value
}

return total % 10 === 0

 }

that works

Great!

Now you also don’t have the problem of changing the original array! Before you changed the values in the array to new values and now you store the value in a variable instead!

Btw, try out the valid3 variable too. That one is only 15 digits long which means you might have to do another extra thing to get the if (i % 2 === 0) to work correctly for that one too. I had some troubles there when I went on to the next task!

Good job!

if (i % 2 === 0) should i change this line or adding to it.

im a little lost. but you are correct 3 is not working

Well so right now you are looking for even numbers based on the index in the loop. This works for the credit cards that have 16 numbers but valid3 has 15 which means that it’s multiplying the wrong elements.

I would recommend having a separate counter variable that you use instead of i.

I solved it by looping through with the last index included and increasing the counter by 1 every loop, that made it multiply the uneven indexes even if the length was 15 numbers.

I have copied my loop below if you want to check it:

let sum = 0; let counter = 0; for (let i = array.length - 1; i >= 0; i--) { counter++; let value = array[i]; if (counter % 2 === 0) { value *= 2; } if (value > 9) { value -= 9; } sum += value; }