Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的for循环不能正常工作,但是我不知道为什么_Javascript - Fatal编程技术网

Javascript 我的for循环不能正常工作,但是我不知道为什么

Javascript 我的for循环不能正常工作,但是我不知道为什么,javascript,Javascript,因此,基本上我正在编写一个脚本,它接收信用卡号码并输出提供商名称。(同样,如果我以一种过于复杂的方式来做这件事,我会感谢你的建议) 但我的初始for循环在每个对象上迭代不起作用。它将达到3(即使arr的长度是8),然后停止 我目瞪口呆,因为我已经重新阅读了一个小时的代码,检查了我能想到的一切,但我只是撞到了墙上。任何帮助都将不胜感激 代码 var detectNetwork = function(cardNumber) { var splitDigits = cardNumber.split('

因此,基本上我正在编写一个脚本,它接收信用卡号码并输出提供商名称。(同样,如果我以一种过于复杂的方式来做这件事,我会感谢你的建议)

但我的初始for循环在每个对象上迭代不起作用。它将达到3(即使arr的长度是8),然后停止

我目瞪口呆,因为我已经重新阅读了一个小时的代码,检查了我能想到的一切,但我只是撞到了墙上。任何帮助都将不胜感激

代码

var detectNetwork = function(cardNumber) {
var splitDigits = cardNumber.split('');
var length = splitDigits.length;
var first = splitDigits[0];
var second = splitDigits[1];
var firstTwo = splitDigits[0] + splitDigits[1];
var firstThree = splitDigits[0] + splitDigits[1] + splitDigits[2];
var firstFour = splitDigits[0] + splitDigits[1] + splitDigits[2] + splitDigits[3];
var firstSix = splitDigits[0] + splitDigits[1] + splitDigits[2] + splitDigits[3] + splitDigits[4] + splitDigits[5];

var checkProvider = [
    {
        name: 'American Express',
        length: [ 15 ],
        prefixLength: [ 2 ],
        prefixType: 'simple',
        prefix: [ 34, 37 ]
    },

    {
        name: 'Diner\'s Club',
        length: [ 14 ],
        prefixLength: [ 2 ],
        prefixType: 'simple',
        prefix: [ 38, 39 ]
    },

    {
        name: 'Visa',
        length: [ 13, 16, 19 ],
        prefixLength: [ 1 ],
        prefixType: 'simple',
        prefix: [ 4 ]
    },

    {
        name: 'MasterCard',
        length: [ 16 ],
        prefixLength: [ 2 ],
        prefixType: 'range',
        prefix: [ 51, 55 ]
    },

    {
        name: 'Discover',
        length: [ 16, 19 ],
        prefixLength: [ 2, 3, 4],
        prefixType: 'complexRange',
        prefix: [ 6011, [ 644, 649 ], 65 ]
    },

    {
        name: 'Maestro',
        length: [ 12, 13, 14, 15, 16, 17, 18, 19],
        prefixLength: [ 4 ],
        prefixType: 'simple',
        prefix: [ 5018, 5020, 5038, 6304 ]
    },

    {
        name: 'China UnionPay',
        length: [ 16, 17, 18, 19 ],
        prefixLength: [ 3, 4, 6 ],
        prefixType: 'complexRange',
        prefix: [ [ 622126, 622925 ], [ 624, 626 ], [ 6282, 6288 ] ]
    },

    {
        name: 'Switch',
        length: [ 16, 18, 19 ],
        prefixLength: [ 4, 6 ],
        prefixType: 'simple',
        prefix: [ 4903, 4905, 4911, 4936, 564182, 633110, 6333, 6759 ]
    }
];

for(var i = 0; i < checkProvider.length; i++) {
    var currentProvider = checkProvider[i];
    var name = currentProvider.name;
    var lengthOptions = currentProvider.length;
    var prefixLengthOptions = currentProvider.prefixLength;
    var prefixType = currentProvider.prefixType;
    var prefixOptions = currentProvider.prefix;

    for(var j = 0; j < lengthOptions.length; j++) {
        var currentLength = lengthOptions[j];
        if (currentLength === length) {
            //Use first
            for (var y = 0; y < prefixLengthOptions.length; y++) {
                var currentPrefixLength = prefixLengthOptions[y];
                if(currentPrefixLength === 1) {
                    if (first === '4') {
                        if (firstFour !== 4903 && firstFour !== 4905 && firstFour !== 4911 && firstFour !== 4936) {
                            return name;
                        }
                    }
                }
                if (currentPrefixLength === 2) {
                    if (prefixType === 'complexRange') {
                        console.log(name);
                    }
                    if (prefixType === 'simple') {
                        for (var i = 0; i < prefixOptions.length; i++) {
                            if (firstTwo === prefixOptions[i].toString()) {
                                return name;
                            }
                        }
                    }
                    if (prefixType === 'range') {
                        var min = prefixOptions[0];
                        var max = prefixOptions[1];
                        for (var i = min; i < max + 1; i++) {
                            if (firstTwo === i.toString()) {
                                return name;
                            }
                        }
                    }  
                }
            }
        }
    }
}
}
var检测网络=功能(卡号){
var splitDigits=卡号。拆分(“”);
变量长度=splitDigits.length;
var first=拆分位数[0];
第二个变量=拆分位数[1];
var FIRSTWO=拆分数字[0]+拆分数字[1];
var firstThree=splitDigits[0]+splitDigits[1]+splitDigits[2];
var firstFour=拆分数字[0]+拆分数字[1]+拆分数字[2]+拆分数字[3];
var FIRST6=拆分数字[0]+拆分数字[1]+拆分数字[2]+拆分数字[3]+拆分数字[4]+拆分数字[5];
var检查提供程序=[
{
名称:'美国运通',
长度:[15],
前置桥长度:[2],
prefixType:'简单',
前缀:[34,37]
},
{
名称:“餐厅俱乐部”,
长度:[14],
前置桥长度:[2],
prefixType:'简单',
前缀:[38,39]
},
{
姓名:“Visa”,
长度:[13,16,19],
前置桥长度:[1],
prefixType:'简单',
前缀:[4]
},
{
姓名:'万事达卡',
长度:[16],
前置桥长度:[2],
prefixType:“范围”,
前缀:[51,55]
},
{
名称:“发现”,
长度:[16,19],
前桥长度:[2,3,4],
prefixType:“complexRange”,
前缀:[6011[644649],65]
},
{
名称:“大师”,
长度:[12,13,14,15,16,17,18,19],
前置桥长度:[4],
prefixType:'简单',
前缀:[5018502050386304]
},
{
名称:“中国银联”,
长度:[16,17,18,19],
前桥长度:[3,4,6],
prefixType:“complexRange”,
前缀:[[622126622925],[624626],[62826288]]
},
{
名称:'开关',
长度:[16,18,19],
前桥长度:[4,6],
prefixType:'简单',
前缀:[490349054911149365641826331106336759]
}
];
对于(var i=0;i
您的测试
检测网络('6011123456789303')
日志
Discover
如果您对代码进行以下小更改:

  • 将所有
    var
    替换为
    const
  • 使用
    let
    声明所有循环索引变量。例如,
    For(设i=0;

  • 当前代码的问题是在同一上下文中重新声明了
    var i
    。这些情况不会触发错误,但是当值被覆盖时,行为将变得混乱,这就是您的情况

    建议将另一个
    var i
    重命名为其他名称,这将解决您的问题

    另一个选项是使用
    let i

    因此,这段代码将工作得最好(如果总是返回名称,我会这样做):

    const detectNetwork=函数(卡号){
    常量splitDigits=cardNumber.split(“”);
    const length=splitDigits.length;
    const first=splitDigits[0];
    常数秒=拆分数字[1];
    const firstTwo=splitDigits[0]+splitDigits[1];
    常量firstThree=拆分数字[0]+拆分数字[1]+拆分数字[2];
    const firstFour=splitDigits[0]+splitDigits[1]+splitDigits[2]+splitDigits[3];
    常量firstSix=splitDigits[0]+splitDigits[1]+splitDigits[2]+splitDigits[3]+splitDigits[4]+splitDigits[5];
    常量检查提供程序=[
    {
    名称:'美国运通',
    长度:[15],
    前置桥长度:[2],
    prefixType:'简单',
    前缀:[34,37]
    },
    {
    名称:“餐厅俱乐部”,
    长度:[14],
    前置桥长度:[2],
    
    const detectNetwork = function(cardNumber) {
    const splitDigits = cardNumber.split('');
    const length = splitDigits.length;
    const first = splitDigits[0];
    const second = splitDigits[1];
    const firstTwo = splitDigits[0] + splitDigits[1];
    const firstThree = splitDigits[0] + splitDigits[1] + splitDigits[2];
    const firstFour = splitDigits[0] + splitDigits[1] + splitDigits[2] + splitDigits[3];
    const firstSix = splitDigits[0] + splitDigits[1] + splitDigits[2] + splitDigits[3] + splitDigits[4] + splitDigits[5];
    
    const checkProvider = [
        {
            name: 'American Express',
            length: [ 15 ],
            prefixLength: [ 2 ],
            prefixType: 'simple',
            prefix: [ 34, 37 ]
        },
    
        {
            name: 'Diner\'s Club',
            length: [ 14 ],
            prefixLength: [ 2 ],
            prefixType: 'simple',
            prefix: [ 38, 39 ]
        },
    
        {
            name: 'Visa',
            length: [ 13, 16, 19 ],
            prefixLength: [ 1 ],
            prefixType: 'simple',
            prefix: [ 4 ]
        },
    
        {
            name: 'MasterCard',
            length: [ 16 ],
            prefixLength: [ 2 ],
            prefixType: 'range',
            prefix: [ 51, 55 ]
        },
    
        {
            name: 'Discover',
            length: [ 16, 19 ],
            prefixLength: [ 2, 3, 4],
            prefixType: 'complexRange',
            prefix: [ 6011, [ 644, 649 ], 65 ]
        },
    
        {
            name: 'Maestro',
            length: [ 12, 13, 14, 15, 16, 17, 18, 19],
            prefixLength: [ 4 ],
            prefixType: 'simple',
            prefix: [ 5018, 5020, 5038, 6304 ]
        },
    
        {
            name: 'China UnionPay',
            length: [ 16, 17, 18, 19 ],
            prefixLength: [ 3, 4, 6 ],
            prefixType: 'complexRange',
            prefix: [ [ 622126, 622925 ], [ 624, 626 ], [ 6282, 6288 ] ]
        },
    
        {
            name: 'Switch',
            length: [ 16, 18, 19 ],
            prefixLength: [ 4, 6 ],
            prefixType: 'simple',
            prefix: [ 4903, 4905, 4911, 4936, 564182, 633110, 6333, 6759 ]
        }
    ];
    
    for(let i = 0; i < checkProvider.length; i++) {
        let currentProvider = checkProvider[i];
        let name = currentProvider.name;
        let lengthOptions = currentProvider.length;
        let prefixLengthOptions = currentProvider.prefixLength;
        let prefixType = currentProvider.prefixType;
        let prefixOptions = currentProvider.prefix;
    
        for(let j = 0; j < lengthOptions.length; j++) {
            let currentLength = lengthOptions[j];
            if (currentLength === length) {
                //Use first
                for (let y = 0; y < prefixLengthOptions.length; y++) {
                    let currentPrefixLength = prefixLengthOptions[y];
                    if(currentPrefixLength === 1) {
                        if (first === '4') {
                            if (firstFour !== 4903 && firstFour !== 4905 && firstFour !== 4911 && firstFour !== 4936) {
                                return name;
                            }
                        }
                    }
                    if (currentPrefixLength === 2) {
                        if (prefixType === 'complexRange') {
                            return(name);
                        }
                        if (prefixType === 'simple') {
                            for (let i = 0; i < prefixOptions.length; i++) {
                                if (firstTwo === prefixOptions[i].toString()) {
                                    return name;
                                }
                            }
                        }
                        if (prefixType === 'range') {
                            let min = prefixOptions[0];
                            let max = prefixOptions[1];
                            for (let i = min; i < max + 1; i++) {
                                if (firstTwo === i.toString()) {
                                    return name;
                                }
                            }
                        }  
                    }
                }
            }
        }
    }
    }
    
    var n = detectNetwork('6011123456789303');
    console.log(n);  // Discover