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