【问题标题】:My function returns the catch all when i'm passing a string that fits the parameters I've tried to set. How to proceed?当我传递一个符合我尝试设置的参数的字符串时,我的函数会返回全部捕获。如何进行?
【发布时间】:2021-06-18 11:29:39
【问题描述】:

我在这个项目的第二步中遇到了困难。当我输入 Visa 或 MasterCard 卡号时,我的控制台测试返回“卡号无法识别”,其目的是检测卡号来自哪个网络。非常感谢您能提供给我的任何见解。

var detectNetwork = function(cardNumber) {
  // Note: `cardNumber` will always be a string
  var splt = cardNumber.split('');
  // The Diner's Club network always starts with a 38 or 39 and is 14 digits long
  if ((splt[0] === '3') && (splt[1] === '8' || splt[1] === '9') && (splt.length === 14)) {
    return 'Diner\'s Club';
  } else if ((splt[0] === '3') && (splt[1] === '4' || splt[1] === '7') && (splt.length === 15)) {
    return 'American Express';
  } else if ((splt[0] === '4') &&
    (splt.length === 13 ||
    splt.length === 16 ||
    splt.length === 19)) {
    return 'Visa';
  } else if ((splt[0] === '5') &&
    ((splt[1] === '1') || (splt[1] === '2') || (splt[1] === '3') ||
    (splt[1] === '4') || (splt[1] === '5')) &&
    (splt.length === 16)) {
    return 'MasterCard';
  } else {
    return 'Card number not recognized';
  }
  // The American Express network always starts with a 34 or 37 and is 15 digits long

  // Once you've read this, go ahead and try to implement this function, then return to the console.
};

【问题讨论】:

  • 您能否在代码中添加一些对该函数的调用,但实际参数并未给出预期结果?

标签: javascript function boolean


【解决方案1】:

我宁愿使用RegExp,而不是使用一堆IF,这样更容易实现你想要实现的目标。

除此之外,在检查字符串之前,我还建议您清理它,以防万一您遇到以下情况:

1234-1234.1234 1234$1234

它会被清理干净,你会得到类似的东西:

12341234123412341234

而且更容易检查是否真的匹配

这里你已经应用了我的所有建议并且正在发挥作用,我为每个案例举了一个例子,同时你可以看到前 1/2 位是分开的,所以你可以更好地识别它。

const replacer = /[^\d]/g;
const dinnersRegex = /^3(8|9)\d{12}$/;
const americanRegex = /^3(4|7)\d{13}$/;
const visaRegex = /^4(\d{18}|\d{15}|\d{12})$/;
const masterRegex = /^5(1|2|3|4|5)\d{14}$/;

var detectNetwork = function(cardNumber) {
  // lets replace all weird characters BUT numbers.
  const cleanNumber = cardNumber.replace(replacer, "")

  if (dinnersRegex.test(cleanNumber)) {
    return 'Diner\'s Club';
  } else if (americanRegex.test(cleanNumber)) {
    return 'American Express';
  } else if (visaRegex.test(cleanNumber)) {
    return 'Visa';
  } else if (masterRegex.test(cleanNumber)) {
    return 'MasterCard';
  } else {
    return 'Card number not recognized';
  }
};

// used some weird symbols to use the cleaner and see if it works.
console.log("diners1:", detectNetwork("38--12-1231-1234-12"))
console.log("diners2:", detectNetwork("39--12-1231-1234-12"))

console.log("american1:", detectNetwork("34 121231 1234 129"))
console.log("american2:", detectNetwork("37 121231 1234 129"))

console.log("visa1:", detectNetwork("4  712.1231.1234.1291.123"))
console.log("visa2:", detectNetwork("4  712123112341298"))
console.log("visa3:", detectNetwork("4  712123112341"))

console.log("master1:", detectNetwork("5  112123112341291"))
console.log("master1:", detectNetwork("5  212123112341291"))
console.log("master1:", detectNetwork("5  312123112341291"))
console.log("master1:", detectNetwork("5  412123112341291"))
console.log("master1:", detectNetwork("5  512123112341291"))

console.log("unrecognized:", detectNetwork("9812311234129"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多