繁体   English   中英

使用 Array.prototype.filter() 解决这个 JS 问题

[英]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;
}

但我不会推荐它。

你可以带


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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM