Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 对于奇数和偶数长度的数字,如何最好地确定RightHost数字左侧的数字?_Javascript_Algorithm_Luhn - Fatal编程技术网

Javascript 对于奇数和偶数长度的数字,如何最好地确定RightHost数字左侧的数字?

Javascript 对于奇数和偶数长度的数字,如何最好地确定RightHost数字左侧的数字?,javascript,algorithm,luhn,Javascript,Algorithm,Luhn,我正在写一个代码来检查一定数量的信用卡号输入是否有效。我写过: function validCreditCard(value) { // accept only digits, dashes or spaces if (value.trim().length <= 1) return 'Value entered must be greater than 1'; if (/[^0-9\s]+/.test(value)) return false; // R

我正在写一个代码来检查一定数量的信用卡号输入是否有效。我写过:

function validCreditCard(value) {
    // accept only digits, dashes or spaces
    if (value.trim().length <= 1) return 'Value entered must be greater than 1';
    if (/[^0-9\s]+/.test(value)) return false;

    // Remove all white spaces
    value = value.replace(/\D/g, '');

    for (var i = 0; i < value.length; i++) {
    // code goes here
    // Loop through the string from the rightmost moving left and double the value of every second digit.
}
函数validCreditCard(值){
//仅接受数字、破折号或空格
if(value.trim().length
从最右边向左移动循环字符串,并将
每第二个数字的值

您可以使用
.reverse()
.map()
和余数运算符
%

设arr=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
var res=[…arr].reverse().map((a,i)=>i%2?a*2:a).reverse();
console.log(res);
要知道哪些是“从右开始的每一秒数字”,实际上不需要从头到尾迭代。也可以从左到右迭代。要知道某个数字是否是这样的“第二”位,请将其奇偶校验与输入长度的奇偶校验进行比较

所以像这样:

var parity = value.length % 2;
for (var i = 0; i < value.length; i++) {
    if (i % 2 === parity) {
        // "Special" treatment comes here
    } else {
        // "Normal" treatment comes here
    }
}
var奇偶校验=value.length%2;
对于(变量i=0;i
但如果输入的长度为奇数,您也可以在输入前加上前缀零,使其长度为偶数:

if (value.length % 2) value = '0' + value;
for (var i = 0; i < value.length; i++) {
    if (i % 2 === 0) {
        // "Special" treatment comes here
    } else {
        // "Normal" treatment comes here
    }
}
if(value.length%2)值='0'+值;
对于(变量i=0;i
您正在实现的称为。因此,使用长度奇偶校验时,它可能如下所示:

var parity = value.length % 2;
for (var i = 0; i < value.length; i++) {
    if (i % 2 === parity) {
        // "Special" treatment comes here
    } else {
        // "Normal" treatment comes here
    }
}
函数validCreditCard(值){
//仅接受数字、破折号或空格
if(/[^0-9\s-]+/.test(value))返回false;
//只获取数字
值=值。替换(/\D/g,“”);
//至少需要一个数字
如果(!value.length)返回false;
var奇偶性=value.length%2;
var总和=0;
对于(变量i=0;i4')//双精度,如果双精度>9,则添加一个
:+值[i];//正常情况
}
返回和%10==0;
}

console.log(validCreditCard(“4024007112651582”);
“每两位数的值加倍”?如果数字大于4会发生什么?你能用你当前的代码发布一两个例子吗?一个简单的解决方案:如果输入的长度是奇数,则在输入前加上一个额外的零。现在你只有一个案例。请解释for循环中发生了什么。解释添加到我的答案中。哇!
(值[i]*2)%10+(值[i]>“4”)
。在5的情况下,
(5*2)%10+(值[i]>“4')=10%10+('5'>'4')=0+1(真)=1
,对于6,
(6*2)%10+(值[i]>“4')=12%10+('6'>'4')=2+1(真)=3
(值[i]>(7*2)%10+)=14%10+('7'>'4')=4')=14%10+('7'>'4')=5……
将始终导致false(0)并添加到余数中,余数将始终是数字。您使用奇偶校验(0和1)在一行中逐步完成所有操作的方式非常别致。我从未想到过这种方式,感谢分享的知识!