Reversed loop

Hello. Im doing Credit Card Checker https://www.codecademy.com/practice/projects/credit-card-checker it should return valid but it returns invalid

const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8]

function validateCred(array) {

  emptyArray = [];

  everyOther = [];

  for (let i=array.length-1; i > 0; i--) {

    emptyArray.push(array[i]);

  }

  

  for (let j=1; j < emptyArray.length; j += 2) {

    everyOther.push(emptyArray[j]);

  }

  modified = everyOther.map(function multiply(s){

    let multiplied = s*2;

    if (multiplied > 9){

    return multiplied - 9;

    }else{

      return multiplied;

    }

  })

  let sum = modified.reduce((a, b) => a+b, 0);

  if(sum%10 == 0) {

    console.log("credit card number is valid")

  }else {

    console.log("credit card number is invalid")}

  return [emptyArray, everyOther, modified, sum];

}

console.log(validateCred(valid1))
1 Like

I believe the issue is is in your very first loop. According to the exercise the first digit on the right is a check digit, then you iterate backwards. However, in your first for loop you are starting with the check digit (index length-1), and leaving out the first digit (index 0). You want to write the loop in such a way that you’re excluding the check digit, and including the first digit. Then it should give you the correct result.

1 Like

replaced i > 0 with i >=0, but still says “invalid number” even though computation is correct

function validateCred(array) {

  emptyArray = [];

  everyOther = [];

  array2 = [];

  for (let x=0; array.length >=)

  

  for (let i=array2.length-1; i >= 0; i--) {

    emptyArray.push(array2[i]);

  }

  

  for (let j=1; j < emptyArray.length; j += 2) {

    everyOther.push(emptyArray[j]);

  }

  modified = everyOther.map(function multiply(s){

    let multiplied = s*2;

    if (multiplied > 9){

    return multiplied - 9;

    }else{

      return multiplied;

    }

  })

  let sum = modified.reduce((a, b) => a+b, 0);

  if(sum%10 == 0) {

    console.log("credit card number is valid")

  }else {

    console.log("credit card number is invalid")}

  return [emptyArray, everyOther, modified, sum];

}

console.log(validateCred(valid1))

Ah I think I see the issue. modified is the array of every other element, however you still need to add the rest of the elements that didn’t need to be doubled. So what you should be getting as your final sum for this number is 80, however it’s 25 as you’re only adding the ones you doubled.
So you’ll need to find a way of getting the sum of the remaining elements and then adding that onto your sum, which should then make it valid.

1 Like

It’s always good to get visuals on what’s going on in loops. Not only does it solve problems, but it strengthens recognition of patters :sweat_smile:

1 Like

Can’t figure out how to add “modified” to “sumArray”

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:
function validateCred(array) {
  emptyArray = [];
  everyOther = [];
  everyAnother = [];
  sumArray = [];
  
  for (let i=array.length-1; i >= 0; i--) {
    emptyArray.push(array[i]);
  }
  
  for (let j=1; j < emptyArray.length; j += 2) {
    everyOther.push(emptyArray[j]);
    
  }
  for (let x=0; x < emptyArray.length; x +=2){
    everyAnother.push(emptyArray[x]);
    sumArray.push(emptyArray[x]);
  }
  modified = everyOther.map(function multiply(s){
    let multiplied = s*2;
    if (multiplied > 9){
    return multiplied-9
    }else{
      return multiplied;
    }
  })
  console.log(typeof modified)
  for (let p=0; p < modified; p++) {
    sumArray.push(modified[p]);
  }
  let sum = sumArray.reduce((a, b) => a+b, 0);
  if(sum%10 == 0) {
    console.log("credit card number is valid")
  }else {
    console.log("credit card number is invalid")}
  return [emptyArray, everyOther, everyAnother, modified, sumArray, sum];
}


console.log(validateCred(valid1))