Search code examples
javascriptarraysalgorithmfunctioncredit-card

Credit card checker luhn algorithm javascript


I'm currently making a credit card checker(Luhn algorithm) from the Codecademy project but my function does not seem to work, because it gives me back "false" with an array that has to return "true"(valid3). Can anyone helps me?

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

// An array of all the arrays above
const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5];

// Add your functions below:

function validateCred(arr) {
  let reverseArr = arr.reverse()
  let sum = 0;
  for (let i = 0; i < reverseArr.length; i += 2) {
    sum += reverseArr[i];
    sum += reverseArr[i + 1] * 2;
    if (reverseArr[i + 1] * 2 > 9) {
      sum -= 9;
    }
  }
  if (sum % 10 === 0) {
    return true
  } else {
    return false
  }
}

function findInvalidCards(arr000) {
  let invalidArr = []
  for (let j = 0; j < arr000.length; j++) {
    if (validateCred(arr000[j]) === false) {
      invalidArr.push(arr000[j])
    }
  }
  return invalidArr;
}

let arr = [4, 5, 5, 6, 7, 3, 7, 5, 8, 6, 8, 9, 9, 8, 5]
let arr1 = 6
console.log(validateCred(valid3))

console.log(findInvalidCards(batch))


Solution

  • valid3 has an odd number of elements so reverseArr[i + 1] becomes undefined in validateCred. Perhaps you can check that reverseArr[i + 1] has a value before adding it to the sum:

    // 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];
    
    // An array of all the arrays above
    const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5];
    
    // Add your functions below:
    
    function validateCred(arr) {
      let reverseArr = [...arr].reverse()
      let sum = 0;
      for (let i = 0; i < reverseArr.length; i += 2) {
        sum += reverseArr[i];
        
        if(reverseArr[i + 1]) { // Check reverseArr[i + 1] has a value
          sum += reverseArr[i + 1] * 2;
          if (reverseArr[i + 1] * 2 > 9) {
            sum -= 9;
          }
        }
      }
      
      return sum % 10 === 0;
    }
    
    
    console.log(batch.map(validateCred))