Credit Card Checker Project

Hi,
I’m struggling to understand why the findInvalidCard function is printing an array of empty array’s instead of printing out the actual values when I call it!

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];


// Add your functions below:

const validateCred = (arr) => {
  let newArr = arr.splice(0,arr.length-1)
  newArr = newArr.reverse();
  for (let i = newArr.length - 1; i >= 0; i -= 1) {
    if (i % 2 === 0) {
      if ((newArr[i] * 2) > 9) {
        newArr[i] = (newArr[i] * 2) - 9;
      }
      else {
        newArr[i] = newArr[i] * 2; 
      }
    }
    else {
      newArr[i];
    }
  }
  const reducer = (accumulator, currentValue) => accumulator + currentValue;
let result = (newArr.reduce(reducer) + arr.pop())
if (result % 10 === 0) {
  return true
}
else {
  return false
}
 // console.log(newArr)
}

//console.log(validateCred(mystery5))

const findInvalidCards = (cards) => {
  let invalidCards = [];
  for (card of cards) {
    if (!validateCred(card)) {
    	invalidCards.push(card);
    }  
  }
  return invalidCards;
}

console.log(findInvalidCards(batch))

//this prints [ , , , , , , , ] instead of what I would expect [invalid1, invalid2… etc]

help would be appreciated!

Hi @ruby2350228250
The problem is that you do not only evaluate a boolean here:

But you alter the card with this function call in your if clause.
The card goes through several destructive processes in the function validateCred.
If you replace the function call in your if clause by simply ‘true’, you’ll see that the whole stack gets pushed to the array. Change your function validateCred in a way that the array passed in as an argument stays untouched.

// Add your functions below:
const validateCred = array =>{ 
    let leng = array.length; // rigth number
    let secondHouse = leng % 2; //the second House after the right number
    let sum = 0; 
    for( i = leng -1; i >=0; i--){ //loop right to left
        var d = parseInt(array[i])// take the check number
        if (i % 2 == secondHouse) {d *=2}// apply *2 to the second house number
        if (d > 9) {d -= 9}// apply -9 for numbers upper than 9
        sum +=d
    }
    return sum%10 == 0;// false or true?
}
console.log(validateCred(valid1));//true
console.log(validateCred(valid4));// true
console.log(validateCred(invalid1));// false

const findInvalidCards = arr =>{
  let invalidCard = [];// new array for the invalid cards
  for(j = 0; j < arr.legth; j++){ //loop in the nested array
    let nestedArray = arr[j]
    validateCred(nestedArray)//apply the check function
  }
  if (false){
      invalidCard.push(arr[j])
  }
  return invalidCard
}
console.log(findInvalidCards(batch));// empty array

I am with some trouble return another nested array of invalid cards.
my code results in empty array…

Two mistake:

  1. A typo, it’s arr.length instead of arr.legth
  2. the if should inside for loop and use the result.
    Here you go the fixed version by change function expression to function:
function findInvalidCards(arr) {
    let invalidCard = []; // new array for the invalid cards
    for (let j = 0; j < arr.length; j++) {
        //loop in the nested array
        let nestedArray = arr[j];
        if (!validateCred(nestedArray)) {
            invalidCard.push(arr[j]);
        }
    }
    return invalidCard;
}
1 Like