Функция не возвращает «China UnionPay», не знаю, почему - PullRequest
0 голосов
/ 16 февраля 2020

Моя функция принимает номер карты, который является строкой, и возвращает имя карты. Кажется, что каждая карта работает, но Китай платит одну. Я получаю неопределенный, не знаю почему. Существует около 800 префиксов China Pay. Я перебрал эти 800 чисел и поместил их в пустой массив, по которому я затем искал индекс. Если он соответствует одному из префиксов в массиве и одной из двух длин, он должен вернуть имя, но это не так.

Любая помощь будет принята с благодарностью. Я уверен, что есть более эффективный способ сделать это, но это куда мой мозг пошел. Это должно работать, не уверен, почему это не так.

  // loop through the 800 numbers and push to an empty array
  var chinaPayPrefix = [];
  for (let i = 622126; i <= 622925; i++){
    let chinaPayStringOne = i.toString();
    chinaPayPrefix.push(chinaPayStringOne);
  }
  for (let j = 6282; j <= 6288; j++){
    let chinaPayStringTwo = j.toString();
    chinaPayPrefix.push(chinaPayStringTwo);
  }
  // card lengths
  const discoverCardLength = [16,19];
  const maestroCardLength = [12,13,14,15,16,17,18,19];
  const visaCardLength = [13,16,19];
  const masterCardLength = 16;
  const dinersCardLength = 14;
  const americanExpressLength = 15;
  const chinaPayLength = [16,19];
  // card prefixes
  const discoverPrefix = ['6011','644','645','646','647','648','649','65'];
  const maestroPrefix = ['5018','5020','5038','6304'];
  const visaPrefix = ['4'];
  const mastercardPrefix = ['51','52','53','54','55'];
  const dinersPrefix = ['38', '39'];
  const americanExpressPrefix = ['34', '37'];
  // substrings of cardNumber
  let singleSplit = cardNumber.substring(0,1);
  let doubleSplit = cardNumber.substring(0,2);
  let tripleSplit = cardNumber.substring(0,3);
  let quadSplit = cardNumber.substring(0,4);
  let sextupleSplit = cardNumber.substring(0,7);
  // search if the applicable substring is present and length is correct
  if (dinersPrefix.indexOf(doubleSplit) > -1 && cardNumber.length === dinersCardLength) {
    return 'Diner\'s Club';
  } else if (americanExpressPrefix.indexOf(doubleSplit) > -1 && cardNumber.length === americanExpressLength) {
    return 'American Express';
  } else if (visaPrefix.indexOf(singleSplit) > -1 && visaCardLength.indexOf(cardNumber.length) > - 1){
    return 'Visa';
  } else if (mastercardPrefix.indexOf(doubleSplit) > -1 && cardNumber.length === masterCardLength){
    return 'MasterCard';
  } else if (discoverPrefix.indexOf(doubleSplit) > -1 || discoverPrefix.indexOf(tripleSplit) > -1 || discoverPrefix.indexOf(quadSplit) > -1 && discoverCardLength.indexOf(cardNumber.length) > - 1){
    return 'Discover';
  } else if (maestroPrefix.indexOf(quadSplit) > - 1 && maestroCardLength.indexOf(cardNumber.length) > - 1){
    return 'Maestro';
  } else if (chinaPayPrefix.indexOf(sextupleSplit) > - 1 && chinaPayLength.indexOf(cardNumber.length) > - 1){
    return 'China UnionPay';
  }else if (chinaPayPrefix.indexOf(quadSplit) > - 1 && chinaPayLength.indexOf(cardNumber.length) > - 1){
    return 'China UnionPay';
  }else if (chinaPayPrefix.indexOf(tripleSplit) > - 1 && chinaPayLength.indexOf(cardNumber.length) > - 1){
    return 'China UnionPay';
  }
};

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Эта строка для 6 символов:

let sextupleSplit = cardNumber.substring(0,7);

должна быть

let sextupleSplit = cardNumber.substring(0,6)
0 голосов
/ 16 февраля 2020
let sextupleSplit = cardNumber.substring(0,7);

должно быть

let sextupleSplit = cardNumber.substring(0,6);

, чтобы взять только первые 6 цифр

quadSplit и tripleSplit в порядке

...