Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.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_Loops_If Statement_Luhn - Fatal编程技术网

Javascript 为什么我的for循环没有注册其块中的第一行?

Javascript 为什么我的for循环没有注册其块中的第一行?,javascript,loops,if-statement,luhn,Javascript,Loops,If Statement,Luhn,最近,我从codeacademy开始学习编码的基础知识,并获得了一个项目,该项目涉及应用Luhn算法来验证信用卡号码。我想我理解这个算法,但我的JavaScript代码似乎出了点问题 //我用这个作为样本来测试它是否有效 const invalid1=[4,5,3,2,7,7,8,7,7,1,0,9,1,7,9,5]; //我将该数组用于这段代码: const validated=arr=>{ 对于let i=arr.length-1;i>=0;i-=2{ 对于设j=arr.length-2;

最近,我从codeacademy开始学习编码的基础知识,并获得了一个项目,该项目涉及应用Luhn算法来验证信用卡号码。我想我理解这个算法,但我的JavaScript代码似乎出了点问题

//我用这个作为样本来测试它是否有效 const invalid1=[4,5,3,2,7,7,8,7,7,1,0,9,1,7,9,5]; //我将该数组用于这段代码: const validated=arr=>{ 对于let i=arr.length-1;i>=0;i-=2{ 对于设j=arr.length-2;j>=0;j-=2{ arr[j]*=2; 如果arr[j]>9{ arr[j]=9; } 常量redFunc=tot,num=>{ 返回tot+num; } 返回总数=arr.reduceredFunc,0; } } }
console.logvalidateCredinvalid1 我在线查看了Luhn算法的实现,发现了一篇实现该算法的博客文章:

看起来您的逻辑有点不正确,下面是帖子中的实现:

const isValid=卡=>{ 常数arr=[] 对于let i=0;iprv+cur%10==0; } 似乎只有一个for循环。当我使用您的输入运行此代码并删除最后的%10==0部分时,我希望它返回数字而不是布尔值,我收到了85,这是您期望的结果。

arr[j]*=2;正在注册

你的逻辑一定是错的。由于您是初学者,我建议您尝试VS代码的Quokka.js扩展,以对代码进行故障排除和测试

就像我在这里做的那样:

//逻辑来源:https://en.wikipedia.org/wiki/Luhn_algorithm 常量validCreditCard1=[4,5,3,9,1,4,8,8,0,3,4,3,6,4,6,7]; const invalidCreditCard1=[4,5,3,2,7,7,8,7,7,1,0,9,1,7,9,5]; 常量validAccountNumber1=[7,9,9,2,7,3,9,8,7,1,3]; const invalidAccountNumber1=[7,9,9,2,7,3,9,8,7,1,1]; /* 1.从最右边的数字(不包括校验位)开始,向左移动, 每两位数的值加倍。校验位既不加倍,也不包括在本次计算中; 第一个加倍的数字是紧靠校验数字左侧的数字。如果这个加倍的结果 运算大于9,例如8×2=16,然后将结果的数字相加,例如16:1+6=7、18:1+8=9或, 或者,通过从结果中减去9,例如16:16,可以找到相同的最终结果− 9 = 7, 18: 18 − 9 = 9. 2.取所有数字的和。 3.如果总模10等于0,如果总模以零结束,则该数字有效 根据卢恩公式;否则无效。 ***例如:*** 第三行中所有数字的总和为67+x。 校验位x是通过计算非校验位之和,然后计算9次得到的 方程形式的模10的值,67×9模10。以算法形式: 计算非校验位67的和。 乘以9603。 单位数字3为校验数字。因此,x=3。 */ const checkLuhnIsValid=异步数组数字,isAccountNumberCheck=>{ 常量arrayDigitsReversed=arrayDigits.slice.reverse; 设totalSum=0; //让checkDigitAccountNumber=null; 等待新的承诺者解决=>{ arrayDigitsReversed.MapDigital,索引,数组=>{ 数字=Numberdigit; 中频数字{ //检查数字是否需要用9减去 如果索引%2==1{digit*=2;如果digit>9{digit-=9;} //加在总数上 总和+=位数; } 如果索引+1==array.length{ //获取总金额的真实支票编号…如果10个帐号+支票编号 //如果isAccountNumberCheck{checkDigitAccountNumber=totalSum*9%10;} 决定 } }; }; 如果totalSum%10==0{返回true;}否则{ 返回false; } }; 异步=>{ 记录'validCreditCard1 isValid=>',等待checkluhnisValidValidValidCreditCard1; console.log'invalidCreditCard1 isValid=>',等待checkLuhnIsValidinvalidCreditCard1; 日志'validAccountNumber1 isValid=>',等待checkLuhnIsValidvalidAccountNumber1,true; 日志'invalidAccountNumber1 isValid=>',等待checkluhnisvalidinaccountnumber1,true; }; 还测试了账号、VISA卡和万事达卡。

我正在在线查看Luhn算法,看起来您的逻辑是错误的。似乎只有一个for循环。它还说每两位数,你的代码是倒数的,这不能保证你不会把第一位数翻倍。我添加了一个代码示例,我也在real cre上测试过 dit卡和工程。