如何有条件地将名称附加到字符串?

How to conditionally append a name to a string?

我正在尝试将公司名称放在卡号前面,这里的代码是我试图让它在前面打印名称的代码。我在这里遇到的问题是每个公司都有规则 - 条件,我正在努力将这些规则变成 if 语句的条件。

我意识到我正在做的 if 语句不是处理这个问题的好方法,但我只是要求解释处理这个问题的最佳方法。

美国运通卡规则: - 长度为 15 - 以“34”或“37”开头

发现卡片规则: - 长度为 16 - 以“6011”开头

万事达卡规则: - 长度为 16 - 以“51”或“55”开头

VISA卡规则: - 以“13”或“16”或“4”开头

我正在从代码中看到的另一个文件中读取数字,我不认为我必须包括这个,但这就是我遇到麻烦的原因 我不是想跳过 if 语句,只是说我的语句不切实际

这是我的代码:

import { createReadStream } from 'fs'
import { createInterface } from 'readline'

const lineReader = createInterface({
  input: createReadStream('data/input.txt')
})

lineReader.on('line', (creditCard: string) => {
  if ((creditCard.length === 15 && creditCard.substring(0, 1) === '37')) {
creditCard = '(AMEX) ' + creditCard + ' valid'
  } else {
return
  }
  console.log('Line from file: ', creditCard)
})

我不确定我是否完全理解您的问题,但下面的代码是我能想到的解决上述问题的最简单方法。

它使用 if 语句。不确定为什么要避开它们。

    if(creditCard.substring(0, 1) === '13' || creditCard.substring(0, 1) === '16' || creditCard.substring(0, 1) === '4'){
      //Visa
    }else if(creditCard.length === 15){
      //AMEX
    }else if(creditCard.substring(0, 1) === '6011'){
      //Discover
    }else{
      //MasterCard
    }

如果您一开始看不到它,我基本上已经对 if 语句进行了排序,以便根据卡片的特定值去除卡片。

这样我就不用担心以后比较那张卡或那个值了。

这就是我为查找 credit/debit 卡片类型所做的工作。但是我确定你不能跳过 if 语句。

// declared all validators regex. 
var validators = {
      'american_express': /^3[47]/,
      'visa': /^4/,
      'mastercard': /^5[1-5]/,
      'discover': /^6011/,
      'amex_length': /^[0-9]{15}$/,
      'visa_length': /^[0-9]{16,16}$/,
      'cvv': /^[0-9]{3}$/,
      'amex_cvv': /^[0-9]{4}$/
};

// create a function to apply validations
function getCardType(cardNumber) {
     var result = "Unknown";
     if (validators.mastercard.test(cardNumber)) {
         result = "MasterCard";
     }else if (validators.visa.test(cardNumber)) {
         result = "Visa";
     }else if (validators.american_express.test(cardNumber)) {
         result = "Amex";
     }else if (validators.discover.test(cardNumber)) {
         result = "Discover";
     }
     return result;
}

我也相信 if 语句在这里会非常好,但这里有另一种编写方式,如果有大量信用卡类型并且您想要扩展卡类型稍后。

它将每种卡片类型转换为一个对象实例,并使用遇到卡片编号时搜索的卡片类型数组。这样,确定卡类型的逻辑实际上不需要知道可用的类型(如果这是设计目标)。

class CreditCardType {
  constructor (
    public name: string,
    public validateNumber: (creditCardNumber) => boolean) {
  }
}

const CARDS: CreditCardType[] = [
  new CreditCardType('AMEX',
    (creditCardNumber) =>
      creditCardNumber.length === 15 && creditCardNumber.substring(0, 1) === '37'),
  new CreditCardType('Visa',
    (creditCardNumber) =>
      creditCardNumber.substring(0, 2) == '13')
]

因此,只要您需要找出卡号的卡类型,您就可以

function getCardType(creditCardNumber: string) {
    return CARDS.find(cardType => 
        cardType.validateNumber(creditCard)).name
)

我已经解决了大部分问题,这将打印数字并附加符合 AMEX 规则的数字 (AMEX) 首先我声明了一个变量: company 然后我修复了子字符串,从 creditCard.substring(0, 1)creditCard.substring(0, 2) 添加在 || creditCard.substring(0, 2) === 34 然后调用我们之前声明的变量 company company = (AMEX) ${creditCard} 确保将 (AMEX) ${creditCard} 包装在反引号

这是完整的代码块:https://imgur.com/krmhbYn(必须使用 imgur 不允许我在代码中使用反引号)

这里是控制台输出:https://imgur.com/j6oSN8R