Now I´m having trouble on the 3rd step.
The function should return all te names of the companies issuers of INVALID card numbers but it returns the VALID ones as well…
Can someone find the mistake on the 3rd step??
Here´s 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];
// For this exercise I´m using the 'Luhn algorithm'
//(STEP 1) ---> Card´s number validation
let validateCred = cardArr => {
//1st- Creating a copy of the array passed (without the last digit) and reversing it
let newArr = cardArr.slice(0, -1).reverse();
//2nd- Iterating through the array, multiplying the numbers in (now) even indexes and substracting 9 if neccesary
for (i = 0; i < newArr.length; i++) {
if (i % 2 === 0 || i === 0) {
newArr[i] *= 2;
if (newArr[i] > 9) {
newArr[i] -= 9;
} else {
newArr[i];
};
} else {
newArr[i];
};
};
//3rd- Sum all the items in newArr
let sum = newArr.reduce((a, b) => a + b);
//4th- Finding out the check digit (last digit of the original card number)
let checkDig = cardArr[cardArr.length-1];
//5th- Final card validation
if ((checkDig + sum) % 10 === 0) {
return true;
} else {
return false;
};
};
//(STEP 2) ---> Creating a function which returns all the invalid card numbers
let findInvalidCards = invCardsArr => {
//1st- Creating the array containing all the invalid card numbers
let invalidCardsArray = [];
//2nd- Iterating through the array passed to find the invalid card numbers and .push() them into the invalidCardsArray
for (y = 0; y < invCardsArr.length; y++) {
let validation = validateCred(invCardsArr[y]);
if (validation === false) {
invalidCardsArray.push(invCardsArr[y]);
};
};
//3rd- Returning the final array
return invalidCardsArray;
};
//(STEP 3) --- Finding out the issuers of invalid card numbers
let idInvalidCardCompanies = invalidsArray => {
//1st- Finding the invalid cards in the array passed !!!!!(THIS IS THE PART WHERE I´M HAVING TROUBLE)!!!!!!
findInvalidCards(invalidsArray); // <-- It doesn´t seem to work???
//2nd- Setting variables for each issuer´s id
let amx = 0;
let visa = 0;
let mc = 0;
let dscv = 0;
let notFound = 0;
//3rd- Iterating through invalidsArray to find out the issuer id of each card number
for (x = 0; x < invalidsArray.length; x++) {
let checkDig = invalidsArray[x] [0];
if (checkDig === 3) {
amx++;
} else if (checkDig === 4) {
visa++;
} else if (checkDig === 5) {
mc++;
} else if (checkDig === 6) {
dscv++;
} else if (checkDig != 3 && checkDig != 4 && checkDig != 5 && checkDig != 6){
notFound++;
};
};
//4th- Final list of invalid cards issuers
let invalidCardIssuers= [];
if (amx > 0) {
invalidCardIssuers.push('Amex');
} if (visa > 0) {
invalidCardIssuers.push('Visa');
} if (mc > 0) {
invalidCardIssuers.push('Mastercard');
} if (dscv > 0) {
invalidCardIssuers.push('Discover');
} if (notFound > 0) {
invalidCardIssuers.push('Company not found');
};
//4th- Returning the final list
return invalidCardIssuers;
};