Credit Card Checker: Only returning a single value for idInvalidCardCompanies function

https://www.codecademy.com/paths/full-stack-engineer-career-path/tracks/fscp-javascript-syntax-part-ii/modules/fecp-challenge-project-credit-card-checker/projects/credit-card-checker

Currently I’m on step #5. It is looping through the array that I get from findInvalid cards, and grabbing the first number and assigning it to a company and pushing it to my company array. If that company exist in the company array already, it will just return true and continue looping through the array.

Right now, I’m just getting “true” instead of my company array and I don’t know why.

// 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=array=>{
    let sum=0;
    let reversedArr= array.reverse();
    let testArr=[];
    for(let i=0; i< array.length; i++){
      if(i%2 ===1){
        let doubleValue=reversedArr[i]*2;
          if(doubleValue>9){
            sum+=(doubleValue-9);
            }
      else{
        sum+=doubleValue
            }
      }   
    else{
      sum+=reversedArr[i];
      }
    }
  if(sum%10===0){
    return true;
      }
  else{
    return false
      }
    };

 const findInvalidCards=nestedArray=>{   
   let verdict=[];
   for(let i=0;i<nestedArray.length; i++){
     if(validateCred(nestedArray[i]) === false){
       verdict.push(nestedArray[i].reverse());
     }

   }
   return verdict
 };   
 
const idInvalidCardCompanies= listOfInvalid =>{
  let company=[]
 for(let i=0;i<listOfInvalid.length;i++){
   if(listOfInvalid[i][0]===3){
     if(company.indexOf("Amex")>0){
       return true
     }else{
     company.push('Amex');
     }
   }
    else if(listOfInvalid[i][0]===4){
      if(company.indexOf("Visa")>0){
       return true
     }else{
     company.push('Visa');
     }
   }
      else if(listOfInvalid[i][0]===5){
      if(company.indexOf("Mastercard")>0){
       return true
     }else{
     company.push('Mastercard');
     }
   }
    else if(listOfInvalid[i][0]===6){
     if(company.indexOf("Discover")>0){
       return true
     }else{
     company.push('Discover');
     }
   }
   else{
     company.push('Company not foound')
   }
 }
return company;
}




console.log(inInvalidCardCompanies(findInvalidCards(batch)));

Code result:

true

I’ve tried messing with the indexOf function but not having any luck.

No clue why I’m just returning true.

You have this:

But why do you have return true here?

Force of habit. But thank you! I just deleted all of the return trues and getting better results.

now I’m getting

[ 'Visa', 'Mastercard', 'Amex', 'Discover', 'Visa' ]

Now I’m not seeing how I’m getting two Visa values if my if statement is not allowing another Visa to be pushed to the company array.

Current code where I’m returning the Visa twice.

// 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=array=>{
    let sum=0;
    let reversedArr= array.reverse();
    let testArr=[];
    for(let i=0; i< array.length; i++){
      if(i%2 ===1){
        let doubleValue=reversedArr[i]*2;
          if(doubleValue>9){
            sum+=(doubleValue-9);
            }
      else{
        sum+=doubleValue
            }
      }   
    else{
      sum+=reversedArr[i];
      }
    }
  if(sum%10===0){
    return true;
      }
  else{
    return false
      }
    };

 const findInvalidCards=nestedArray=>{   
   let verdict=[];
   for(let i=0;i<nestedArray.length; i++){
     if(validateCred(nestedArray[i]) === false){
       verdict.push(nestedArray[i].reverse());
     }

   }
   return verdict
 };   
 
const idInvalidCardCompanies= listOfInvalid =>{
  let company=[];
 for(let i=0;i<listOfInvalid.length;i++){
   if(listOfInvalid[i][0]===3){
     if(company.indexOf("Amex")>0){
       
     }else{
     company.push('Amex');
     }
   }
    else if(listOfInvalid[i][0]===4){
      if(company.indexOf("Visa")>0){
       
     }else{
     company.push("Visa");
     }
   }
      else if(listOfInvalid[i][0]===5){
      if(company.indexOf("Mastercard")>0){
       
     }else{
     company.push('Mastercard');
     }
   }
    else if(listOfInvalid[i][0]===6){
     if(company.indexOf("Discover")>0){
       
     }else{
     company.push('Discover');
     }
   }
   else{
     company.push('Company not found')
   }
 }
return company;
}




console.log(idInvalidCardCompanies(findInvalidCards(batch)));
[ 'Visa', 'Mastercard', 'Amex', 'Discover', 'Visa' ]

I don’t want multiple Visa’s. I only want one.

Sorry if my English is poor.

if you’re trying to check if "Visa" is already in the company array,
then the 0 should be -1 in

because company.indexOf("Visa") returns an index of -1 if "Visa" is not in the company array.

Thank you so much!

Should’ve known that.

Last question,

Why does did taking out the return true statement let me return an array rather than true?

you have

at the end of that function idInvalidCardCompanies
[after the for-loop]

(before, you had returns in the for-loop, so it wouldn’t get to this line in certain situations)

1 Like