Credit Card Checker - Query regarding array cloning

Hey Everyone! Hope you are doing well

I have one query regarding cloning the array since we are not modifying the original array in this case, i have used below code to copy the array into new variable but it didn’t work as it was giving me random array values:

const validateCred = (arr) => {

let sum = 0;

let arrayCopy = arr;
//rest code

Later on, i found out about slice() method and it did work. So just wanted to know what is wrong with assigning arrays directly into new variable. Thanks in Advance!

Here’s my full Solution:

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

const validateCred = (arr) => {
let sum = 0;
let arrayCopy = arr.slice();
const lastElement = arrayCopy.pop();
arrayCopy.reverse();
// console.log(newArr);
for(let i = 0; i < arrayCopy.length; i=i+2){
arrayCopy[i] = arrayCopy[i] * 2;
if(arrayCopy[i] > 9){
arrayCopy[i] = arrayCopy[i] - 9;
}
}

for(const arr of arrayCopy){
sum = sum + arr;
}
sum = sum + lastElement;
// console.log(sum);
if(sum % 10 === 0){
return true;
}else{
return false;
}
}

const findInvalidCards = (nestedArray) => {
let result = [];
for(arr of nestedArray){
const value = validateCred(arr);

if(value === false){
result.push(arr);
}
}
return result;
}

const idInvalidCardCompanies = (nestedArray) => {
const invalidCards = findInvalidCards(nestedArray);
const result = [];
for(const card of invalidCards){
let firstDigit = card[0];
let company = '';
switch(firstDigit) {
case 3:
company = 'Amex (American Express)';
break;
case 4:
company = 'Visa';
break;
case 5:
company = 'Mastercard';
break;
case 6:
company = 'Discover';
break;
default:
}
result.push(company);
}
const uniqueCompanies = [...new Set(result)];
return uniqueCompanies;
}

// console.log(validateCred(invalid5));
// console.log(findInvalidCards(batch));
// console.log(idInvalidCardCompanies(batch));

``````

Hi,
when you’re assigning an array to a new variable as you did here

you create a new variable that is pointing to the same space on the disk as your initial variable does. So you have two variables but just one array.
slice() creates a real copy of the array and so does the spread syntax:

``````const arrCopy = [...originalArray]
``````

Hi, thanks for the quick response!
So basically in this case it will modify the original array irrespective of declaring it into new variable as it is pointing to the same memory space, am i correct?

Yes, that’s right. Some array methods alter the original array – like pop(), reverse() etc. And that would also happen to the original array if you assigned the array to another variable beforehand unless you don’t make a real copy with slice() or the spread syntax.

1 Like