Javascript, Challenge Project: Credit Card Checker

I’m working on this project and have a lot of the work done but am stuck at pushing some array numbers into a new array.

I’ve probably done this in a very cumbersome way but it’s how I’ve worked it out logically stage by stage.

The task:
Create a function, validateCred() that has a parameter of an array. The purpose of validateCred() is to return true when an array contains digits of a valid credit card number and false when it is invalid. This function should NOT mutate the values of the original array.

To find out if a credit card number is valid or not, use the Luhn algorithm. Generally speaking, an algorithm is a series of steps that solve a problem — the Luhn algorithm is a series of mathematical calculations used to validate certain identification numbers, e.g. credit card numbers.

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 reverseArray = ;
let toBeSummed = ;

for(let i = arr.length - 2; i >= 0; i–) {
const valueAtIndex = arr[i]
reverseArray.push(valueAtIndex)
} console.log('Reversed array: ’ + reverseArray);

let odds = reverseArray.filter((num) => num % 2 === 1);
console.log('Odds array: ’ + odds);

let evens = reverseArray.filter((num) => num % 2 === 0);
console.log('Evens array: ’ + evens);
toBeSummed.push(evens);

function duplicate(arr) {
let numDouble = […arr];
for (let i = 0; i < arr.length; i++) {
numDouble[i] = numDouble[i] * 2;
}
return numDouble;
}
//const arr = [1, 2, 3, 4]
const multiples = duplicate(odds)
console.log('Multiples: ’ + multiples)

let aboveNine = multiples.filter(largerNumber => {
return largerNumber > 9;
})
console.log('Numbers above 9: ’ + aboveNine);

function minusThese(arr) {
let minusNineArr = […arr];
for (let i = 0; i < arr.length; i++) {
minusNineArr[i] = minusNineArr[i] - 9;
}
return minusNineArr;
}

const minusNineNumbers = minusThese(aboveNine)
console.log('Minus 9 numbers: ’ + minusNineNumbers);

for (let i = 0; i < multiples.length; i++){
for (let j = 0; j < aboveNine.length; j++){
if (multiples[i] !== aboveNine[j]){
toBeSummed.push(multiples[i]);
}
}
}

console.log('toBeSummed Array: ’ + toBeSummed);
}

// [19, 5 , 9, 13]

validateCred(valid1);

The final nested for loop is the part where I’m stuck. I want to add numbers from the ‘multiples’ array that do not equal the numbers in ‘aboveNine’ array, to the ‘toBeSummed’ array, but that part doesn’t seem to work.

thanks for any help
S

Can you clarify what you are after here, when you state “I want to add numbers from the ‘multiples’ array that do not equal the numbers in ‘aboveNine’ array, to the ‘toBeSummed’ array,”

When I run your code,

validateCred(valid1)

I see

‘Multiples: 2,18,14,14,18,6,10’

‘Numbers above 9: 18,14,14,18,10’
‘Minus 9 numbers: 9,5,5,9,1’
‘toBeSummed Array: 0,8,6,0,8,0,6,4,2,2,2,2,2,18,18,18,14,14,14,14,14,14,18,18,18,6,6,6,6,6,10,10,10,10’

Based on these results what should be pushed to toBeSummed from Multiples?

I’ve since updated the coding to this:

const validateCred = arr => {
let reverseArray = ;
let multiplied = ;
let toBeSummed = ;

let lastNumber = arr[arr.length - 1];
toBeSummed.push(lastNumber);

//console.log('lastNumber array: ’ + lastNumber);

for(let i = arr.length - 2; i >= 0; i–) {
const valueAtIndex = arr[i]
reverseArray.push(valueAtIndex)
} //console.log('Reversed array: ’ + reverseArray);

let odds = reverseArray.filter((num) => num % 2 === 1);
console.log('Odds array: ’ + odds);

let evens = reverseArray.filter((num) => num % 2 === 0);
console.log('Evens array: ’ + evens);
toBeSummed.push(evens);

function duplicate(arr) {
let numDouble = […arr];
for (let i = 0; i < arr.length; i++) {
numDouble[i] = numDouble[i] * 2;
}
return numDouble;
}
const multiples = duplicate(odds)
duplicate(odds);
multiplied.push(multiples);
console.log('Multiples: ’ + multiples);
console.log('Multiplied: ’ + multiplied);

let aboveNine = multiples.filter(largerNumber => {
return largerNumber > 9;
})
console.log('Numbers above 9: ’ + aboveNine);

function minusThese(arr) {
let minusNineArr = […arr];
for (let i = 0; i < arr.length; i++) {
minusNineArr[i] = minusNineArr[i] - 9;
}
return minusNineArr;
}
//const arr = [1, 2, 3, 4]
const minusNineNumbers = minusThese(aboveNine);
toBeSummed.push(minusNineNumbers)
console.log('Minus 9 numbers: ’ + minusNineNumbers);

let underNine = multiples.filter((num) => num < 9);
toBeSummed.push(underNine);
console.log('Numbers under 9: ’ + underNine);

console.log('This is the joined array ’ + toBeSummed.join()); // 1,2,3;4,5,6;7,8,9
console.log('toBeSummed Array: ’ + toBeSummed);

const finalSum = toBeSummed.reduce((accumulator, currentValue) => {
console.log('The value of accumulator: ', accumulator);
console.log('The value of currentValue: ', currentValue);
return accumulator + currentValue;
}); console.log('Final sum: ’ + finalSum);
}

validateCred(valid1);

I need help with this one:

I think I found your problem. You are trying to join several nested arrays of numbers together using Array.Prototype.Join. This is not giving you the result that you are expecting. Array.Prototype.Join returns all the elements in array as a String, not as Numbers.

What you really want to use here is Prototype.Array.Flat()

This will return nested arrays as one single array with all of the elements. I have included your code below with some modifications.

const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8];
const validateCred = arr => {
let reverseArray = [];
let multiplied = [];
let toBeSummed = [];

let lastNumber = arr[arr.length - 1];
toBeSummed.push(lastNumber);

//console.log('lastNumber array: ’ + lastNumber);

for(let i = arr.length - 2; i >= 0; i--) {
const valueAtIndex = arr[i]
reverseArray.push(valueAtIndex)
} //console.log('Reversed array: ’ + reverseArray);

let odds = reverseArray.filter((num) => num % 2 === 1);
console.log('Odds array: ' + odds);

let evens = reverseArray.filter((num) => num % 2 === 0);
console.log('Evens array: ' + evens);
toBeSummed.push(evens);

function duplicate(arr) {
let numDouble = [...arr];
for (let i = 0; i < arr.length; i++) {
numDouble[i] = numDouble[i] * 2;
}
return numDouble;
}
const multiples = duplicate(odds)
duplicate(odds);
multiplied.push(multiples);
console.log('Multiples: ' + multiples);
console.log('Multiplied: ' + multiplied);

let aboveNine = multiples.filter(largerNumber => {
return largerNumber > 9;
})
console.log('Numbers above 9: ' + aboveNine);

function minusThese(arr) {
let minusNineArr = [...arr];
for (let i = 0; i < arr.length; i++) {
minusNineArr[i] = minusNineArr[i] - 9;
}
return minusNineArr;
}
//const arr = [1, 2, 3, 4]
const minusNineNumbers = minusThese(aboveNine);
toBeSummed.push(minusNineNumbers)
console.log('Minus 9 numbers: ' + minusNineNumbers);

let underNine = multiples.filter((num) => num < 9);
toBeSummed.push(underNine);
console.log('Numbers under 9: ' + underNine);

/*************************************************************************/
This is where you are running into trouble with your code!

// This is what toBeSummed looks like at this point, when you use toBeSummed.join()
/* [ 8,[ 0, 8, 6, 0, 8, 0, 6, 4], [ 9, 5, 5, 9, 1 ], [ 2, 6 ]]

^^^^^^^^^^^^^^ 3 nested arrays within an array. ^^^^^^^^^^^^^^^^^^^^

You can’t perform the reduce method on those nested arrays. When you use the Array.Prototype.Join you
are returning a string, thats is why it looks like all of the numbers are in one big array when you print it out to the console.log, but they are not!

You need to use Array.prototype.flat() to get all of the numbers into one array.
[ 8, 0, 8, 6, 0, 8, 0, 6, 4, 9, 5, 5, 9, 1, 2, 6 ]

/
/
************************************************************************/


console.log('This is the joined array ' + toBeSummed); // 1,2,3;4,5,6;7,8,9
console.log('toBeSummed Array: ' + toBeSummed);

const finalSum = toBeSummed.reduce((accumulator, currentValue) => accumulator + currentValue, 0)
//console.log(toBeSummed)
  
let flatArray = toBeSummed.flat(Infinity);
console.log('Final sum: ' + finalSum);
  console.log(flatArray)



// console.log('The value of accumulator: ', accumulator);
// console.log('The value of currentValue: ', currentValue); 
const toBeSummedFlat = toBeSummed.flat(Infinity);
console.log(`This is the now flattened array: ${toBeSummedFlat}`)
const finalSumWithFlatArray = toBeSummedFlat.reduce((accumulator, currentValue) => accumulator + currentValue, 0)
console.log(`This is the sum of the flattened array: ${finalSumWithFlatArray}`)
2 Likes