Credit Card Checker: findInvalidCards printing empty arrays

Hello!

  • The first function validates a credit card, which returns either true or false depending if the credit card number passes the validation.
  • The second check for invalid cards in a array with nested arrays.

My problem is that on the second function, the code seem to pass on the validation and only filter the invalid cards. But it returns empty arrays instead of the original arrays.

Can anyone help me here? Thanks!

// 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] // // ---------------- DEFINE YOUR FUNCTIONS HERE ---------------- // // Verify if a credit card is valid based on Luhn algorithm. function validateCred (arr) { const checkDigits = []; let doubleDigits = []; const length = arr.length; // Split numbers into check digits array and double digits array. for (let i = 0; i < Math.round(length/2); i++){ checkDigits.push(arr.pop()); if (arr.length > 0){ doubleDigits.push(arr.pop()); } } // Double numbers and subtrac 9 if number > 9. doubleDigits = doubleDigits.map(num => { num += num; if (num > 9) { num -= 9; } return num; }); // Check if sum of all numbers in both arrays divided by 10 has 0 remainder. const sum = checkDigits.reduce((a,b) => a + b) + doubleDigits.reduce((a,b) => a + b) if (sum % 10 === 0){ //console.log('True') return true; } else { //console.log('False') return false; } }; // Function that find invalid cards. function findInvalidCards (arr) { // PROBLEM *** // Function is validading correctly but arrays are ***empty***. return arr.filter(item => validateCred(item) === false); }; console.log(findInvalidCards(batch));

Challenge Project: Credit Card Checker

Hi,
actually, your problem is in the first function. Somewhere in the instructions, you’ll find the hint that you should not alter the original credit card arrays. But you do that in in your first function:

checkDigits.push(arr.pop());

pop() alters the original array that you pass in as an argument to your function validateCred. That means once your first function ran, your second function just filters empty arrays:

//  this item has the data of the array
//                 ↓
return arr.filter(item => validateCred(item) === false);
//                                ↑ here the original array is empty

Thank you so much!

I just changed the code to instead clone the array and point the variable to a new memory slot and it worked!

const arrayToCheck = [...arr];

1 Like