[英]Solving this JS problem using Array.prototype.filter()
我已经通过使用嵌套的 for 循环以及 some() 和 startsWith() 方法解决了下面的问题。 有没有办法使用 filter() 来解决这个问题? 提前致谢!
编写函数detectNetwork。 它应该接受一个字符串或数字作为其 cardNumber 参数,并且应该根据提供的 cardData 返回适当的网络字符串(如果没有匹配则返回 undefined)。
//cardData array provided by the question var cardData = [{ network: 'Visa', // card issuer (network) prefixes: ['4'], // beginning digits lengths: [13, 16, 19] // lengths of card numbers }, { network: 'Mastercard', prefixes: ['51', '52', '53', '54', '55'], lengths: [16] }, { network: 'American Express', prefixes: ['34', '37'], lengths: [15] }, { network: 'Diner\\'s Club', prefixes: ['38', '39'], lengths: [14] }]; //MY SOLUTION function detectNetwork(cardNumber, cardData) { //convert cardNumber into a String type cardNumber = String(cardNumber); //For each network, check if one of its prefix values matches to the prefix of cardNumber. If so, check if one of its lengths matches to the length of cardNumber. for (let network of cardData) { if (network['prefixes'].some(n => cardNumber.startsWith(n))) { if (network['lengths'].some(n => cardNumber.length === n)) { return network['network']; } } } //If no match, return undefined return; }
虽然您可以使用.filter
,但由于您正在尝试查找一个匹配项(如果没有匹配项, .find
undefined
),因此.find
会更合适:
function detectNetwork(cardNumber, cardData) {
const cardNumberStr = String(cardNumber);
const cardLength = cardNumberStr.length;
const found = cardData.find(({ prefixes, lengths }) => (
prefixes.some(prefix => cardNumberStr.startsWith(prefix)) &&
lengths.some(length => cardLength)
));
return found
? found.network
: undefined;
}
使用.filter
的相同代码将是
function detectNetwork(cardNumber, cardData) {
const cardNumberStr = String(cardNumber);
const cardLength = cardNumberStr.length;
const filteredArr = cardData.filter(({ prefixes, lengths }) => (
prefixes.some(prefix => cardNumberStr.startsWith(prefix)) &&
lengths.some(length => cardLength)
));
return filteredArr.length
? filteredArr[0]
: undefined;
}
但我不会推荐它。
你可以带
if
&&
,Array#includes
和return
语句。function detectNetwork(cardNumber, cardData) {
cardNumber = String(cardNumber);
for (let network of cardData) {
if (
network.prefixes.some(n => cardNumber.startsWith(n)) &&
network.lengths.includes(cardNumber.length)
) {
return network.network;
}
}
}
错过了filter
的问题。 这不适用,因为您想要单个结果,而不是一组networks
。
使用Array#find
代替默认对象并返回想要的属性。
function detectNetwork(cardNumber, cardData) {
cardNumber = String(cardNumber);
return (cardData.find({ prefixes, lengths }) =>
prefixes.some(n => cardNumber.startsWith(n)) &&
lengths.includes(cardNumber.length)) || {})
.network;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.