Credit Card Checker not returning true for valid inputs

Hi, I’m currently attempting the credit card checker project as part of the full stack development course.

My problem is that all the valid credit card number arrays bar valid4 return false when they should be returning true. In other words, the sum mod 10 should equal 0 as according to the following text in the hint: “If the sum modulo 10 is 0 then the array contains a valid number. Conversely, if the result is any number but 0 , then the array contains an invalid number.”

Here is 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]; const validateCred = creditCardNum => { // remove last digit and reverse array let validateArr = creditCardNum.slice(0, creditCardNum.length - 1).reverse(); // double every odd element const doubleOddDigits = x => { if (x % 2 !== 0) { x *= 2; }; // -9 from element if >9 if (x > 9) { x -= 9; }; return x; }; let oddDoubled = validateArr.map(x => doubleOddDigits(x)); // sum elements in array and add on the dropped value const reducer = (previousValue, currentValue) => previousValue + currentValue; let sum = oddDoubled.reduce(reducer) + creditCardNum[creditCardNum.length-1]; // card number is valid if sum mod ten has a remainder of zero return sum % 10 === 0 ? true : false; }; console.log(validateCred(valid1)); console.log(validateCred(valid2)); console.log(validateCred(valid3)); console.log(validateCred(valid4)); console.log(validateCred(invalid1));

I have tested the following parts of my code and to my knowledge they all work as intended:

  • creditCardNum.slice().reverse()
  • doubleOddDigits function
  • Applying doubleOddDigits function using .map()

What am I doing wrong here that results in the modulus of sum and 10 being equal to 10, and hence not returning true?

I also noticed that the algorithm described in the linked Wikipedia article is different to the way codecademy described it in that the doubling of every second number starts from the end digit instead of the skipping the end digit. Why is this, and do both algorithms still do the same thing?

Thanks!

Hi,
what you do here:

// double every odd element
    if (x % 2 !== 0) 

is not doubling every other element of the array but every element that itself is odd.
Here:

let oddDoubled = validateArr.map(x => doubleOddDigits(x));

x is the current element of the array. If x is 6 for example you skip it and if it is 5 you double it. But that is not what you’re supposed to do. You need to double every second item. Therefore you need to pass the index and the item to the function and check if the index % 2 is even or odd.

1 Like