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

时间:2017-11-20 04:51:24

标签: javascript node.js typescript ts-node

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

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

AMEX卡规则: - 长度是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)
})

4 个答案:

答案 0 :(得分:1)

这就是我要查找的信用卡/借记卡类型。但我相信你不能跳过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;
}

答案 1 :(得分:0)

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

它使用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语句,以便根据特定于它们的值去除卡片。

然后我不需要担心比较那张卡或那个值。

答案 2 :(得分:0)

我也相信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
)

答案 3 :(得分:0)

我在很大程度上已经找到了我的问题,这将打印数字和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