【问题标题】:How to conditionally append a name to a string?如何有条件地将名称附加到字符串?
【发布时间】:2017-11-21 10:55:24
【问题描述】:

我正在尝试将公司名称放在卡号前面,这里的代码是我试图让它在前面打印名称的代码。我在这里遇到的问题是每个公司都有规则 - 条件,我正在努力将这些规则变成 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)
})

【问题讨论】:

  • 我不完全理解你的问题。您是否在寻求一种方法来简化逻辑,而不是使用一堆 if 语句?
  • 如果我正在做的语句不是一个好的处理方式你为什么这么认为?
  • @Rajesh 我认为这是因为我需要为每个变化的条件制作一个
  • @YAHsaves 是的,我正在尝试制作一个简单的小条件来适应每张卡的所有规则:如果满足某张卡的条件,它会将公司名称附加到前面信用卡是从另一个文件中读取为字符串的数字
  • 在下面查看我的答案

标签: javascript node.js typescript ts-node


【解决方案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;
}

【讨论】:

  • 只是一个指针,而不是硬编码值,您可以更新您的validators 对象以返回卡片类型,或者拥有一个具有名称的新对象。这样,您可以使您的代码更通用,如果您愿意,甚至可以导出到DB/.json 文件
  • 我正在做一个练习,我正在从另一个文件夹中读取数字并试图让我的代码找出每个数字属于哪个公司,只是为了澄清:creditCard 是 txt 中的每一行文件正在打印到控制台。我正在尝试让我的代码读取该文件,然后附加到相应的数字
  • 只是补充一下,这是我在不同情况下通常会做的事情,这对我正在做的事情不起作用
  • @aidanhamilton 代码是使用 javascript 识别卡片。在您的情况下,无论您获得卡号,无论是表单文本文件还是来自任何其他外部来源,您都可以通过简单地调用 getCardType() 函数来识别其类型,如果您想在车号之前附加卡类型,您可以更新 @ 的返回语句987654325@ 即return result+ " " + cardnumber
  • @Satendra 我明白了,有趣的是我实际上已经弄清楚了我正在做的事情,但我明白为什么这对我正在做的事情是可行的
【解决方案2】:

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

它使用 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 语句进行了排序,这样我就可以根据特定于它们的值来删除卡片。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这对我不起作用,因为我正在从另一个文件中读取卡号: const lineReader = createInterface({ input: createReadStream('data/input.txt') }) lineReader.on( 'line', (creditCard: string) => { console.log('Line from file: ', creditCard) })
    • 你从哪里得到这些数字并不重要。我更新了我的答案以澄清这一点。
    • 我正在使用我的初始代码将我的数字打印到控制台,并且我正在尝试将公司附加到打印到控制台的代码上,这只是练习和学习的练习跨度>
    【解决方案4】:

    我的问题大部分已经弄清楚了,这将打印出符合美国运通规则的数字和附加的数字(美国运通) 首先我声明了一个变量: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

    【讨论】:

      猜你喜欢
      • 2012-05-27
      • 2015-12-23
      • 2013-02-17
      • 2017-06-22
      • 2020-11-16
      • 2018-02-22
      • 2012-01-12
      • 2015-04-04
      • 2021-03-23
      相关资源
      最近更新 更多