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