Stuck on credit card checker project

Hello everyone,

I am quite new to javascript and I would need help to get the credit card checker project done. 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: /////////////////////////

// creo una funzione per calcolare somma valori di array
const arrSum = arr => arr.reduce((a,b) => a + b, 0)

// inizializzo array di output
const doubledDigit = [];

// creo la funzione
function validateCred(card) {
  // iterazione partendo dall'ultimo numero a sinistra
  for(let digitIndex = (card.length - 1); digitIndex >= 0; digitIndex--){
    // push dei numeri che hanno index dispari in array di output
    if(digitIndex % 2 != 0){
      doubledDigit.push(card[digitIndex]);
      // eseguo computazione su numeri che hanno index pari
    } else if (digitIndex % 2 === 0) {
        // se il numero con index pari moltiplicato per due è maggiore di 10 sottraggo 9
        if(card[digitIndex]*2 > 9){
          doubledDigit.push(card[digitIndex]*2-9);
        // se il numero con index pari moltiplicato per due è minotre di 10 push
        } else {
          doubledDigit.push(card[digitIndex]*2);
      }
    }
  } 
  // verifico che somma array di output modulo 10 sia = 0. Se vero la carta è valida.
  if(arrSum(doubledDigit) % 2 === 0){
    console.log(true);
  } else {
    console.log(false);
  }
};

/* calling the function
validateCred(valid1)
validateCred(valid2)
validateCred(valid3)
validateCred(valid4)
validateCred(valid5)
validateCred(invalid1)
validateCred(invalid2)
validateCred(invalid3)
validateCred(invalid4)
validateCred(invalid5)
validateCred(mystery1)
validateCred(mystery2)
validateCred(mystery3)
validateCred(mystery4)
validateCred(mystery5) */

Now I have to create a function ‘findInvalidCards’ that iterates through the ‘batch’ array and push into a new array all the card that seems to be invalid. How can i do that?

Thanks

When I look at your current code I should think you are well able to figure that out.
You are basically already describing what it should do. Your turn to turn this in to code.

function ‘findInvalidCards’ that iterates through the ‘batch’ array and push into a new array all the card that seems to be invalid

Thanks for your comment.
Yes but I tried in many ways and my code did not work. Here I am looking for a possible solution to see if it runs properly. Later I will post here my code so that you could tell me what’s wrong with it.

It is better to go the other way round. Show us your code and we can guide you in the right direction. We are not here to deliver you the code on a silver platter :wink: .

2 Likes

You right :slight_smile:

Here is an example of code that shod work (?)

function findInvalidCards(cards) {
  let invalidCards = [];

  for (let k = 0; k < cards.length; k++) {
      if (!validateCred(cards[k])) {
      invalidCards.push(cards[k]);
    }
  }
   return invalidCards;
}

console.log(findInvalidCards(batch));

this seems to push ALL the credit cards, meaning that the condition is not evaluated properly…

1 Like

Hi there!
I have a quick question. I see many users entered, varName % 2 !=0. I’m wondering why this is used and how it operates through the loop. I think I understand the outcome of using a modulo, but I confused because each element of the array being loop through this modulo when the algorithm is only doubling every other element. Could someone share the flow?

Thanks!

const findInvalidCards = cards => { invalidCards = [] cards.forEach(card => { if (validateCred(card) === false) { invalidCards.push(card); }; }); return invalidCards; };

I tried to use this code using a .forEach loop for part 4 of this problem, however it returns an array containing each of the invalid arrays of numbers rather than the names of the cards from the ‘batch’ array. Can anyone explain why this happens as it seems to me that “card” in my code refers to the entries in ‘batch’ as opposed to the labels of arrays of numbers.

I’ve realised it is because the names of the cards in ‘batch’ are not strings but instead variables referencing other arrays. What is the cleanest way to have an array of the card names returned instead of an array of the card numbers?

Hey, im currently stuck on this project, i am literally stuck. not sure where to start or how. i feel lost like i have missed a chunk of lessons. ive being staring at the screen for 6 hours!

any help is greatly appreciated !!!

3 Likes