JS for循环如何获取第一个值

时间:2016-04-17 14:37:50

标签: javascript for-loop

我很抱歉这个愚蠢的问题。我一直试图这样做几个小时,我真的无法让它工作。所以我有一个循环,循环通过一些数字。
但它没有取第一个值(71990000)。

如何实现这一目标?
这是我到目前为止所得到的:

        var minNr = 0000;
        var maxNr = 10000;
        var prefix = 7199;

        function Nummer(min,max)
        {
            var regex = /^(\d{2})\1$/;

            var guld_nr;
            for(guld_nr = minNr; guld_nr < maxNr;)
            {
                if(regex.test(guld_nr))
                {
                    $(".resultat").append(prefix + "" + guld_nr + "<br>");
                }

                guld_nr++;
            }

        }

输出是这样的:

71991010
71991111
71991212
71991313

但我还需要号码:71990000
我怎么能这样做?

4 个答案:

答案 0 :(得分:0)

使用字符串:

var minNr = '0000';

它是正则表达式测试的起始值,您需要四个零。如果它是一个数字,那么你只需要一个零用于测试。如果你用前导零填充它会有所帮助。

&#13;
&#13;
var minNr = '0000', 
    maxNr = 10000,
    prefix = 7199;

function Nummer(min,max)        {
    var regex = /^(\d{2})\1$/;

    var guld_nr;
    for(guld_nr = minNr; guld_nr < maxNr;guld_nr++)            {
        if(regex.test(guld_nr))                {
            document.write(prefix + "" + guld_nr + "<br>");
        }                
    }
}

Nummer(minNr, maxNr);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

数字不会自己填零; 0000; // 0
为它做一个自定义的零填充方法,这样你就可以zpad(0, 4); // "0000"

function zpad(x, digits) {
    var pad = '0';
    x = x.toString();
    digits -= x.length;
    while (digits > 0) {
        if (digits & 1) x = pad + x;
        pad += pad;
        digits >>>= 1;
    }
    return x;
}

现在相应地调整Nummer

function Nummer(min, max, prefix) {
    var regex = /^(\d{2})\1$/,
        i, str;
    prefix = prefix || '';

    for(i = min; i < max; ++i) {
        str = zpad(i, 4);
        if(regex.test(str)) console.log(prefix + str);
    }
}

并使用

Nummer(minNr, maxNr, '7199');

旁注

  • Nummer未构建对象,请考虑使用驼峰

答案 2 :(得分:0)

这是因为你的正则表达式拒绝数字0;第一次通过循环时,minNr的数值为0(将其设置为0000没有帮助;它只是一种说0的奇特方式)。正则表达式期望两个数字后跟相同的模式,但你给它的是字符串'0'。

您可以将minNr设置为字符串,而不是在第一次传递('0000')时,这将解决'0000'的问题,但您将错过'0101','0202 '等等(将转换为字符串'101','202',等等。)

一种解决方案是将您的号码的字符串表示填零。以下函数将采用任意数字并将零填充它以适合给定的宽度:

function zeropad(n, w) {
    n = String(n);
    while(n.length < w) n = '0' + n;
    return n;
}

您可以使用它转换正则表达式minNr

regex.test(zeropad(guld_nr, 4))

另请注意,Number是JavaScript中文字的内置对象包装器(所有基元都有对象包装器:NumberBooleanString),并且通过创建一个名为Number的函数,您将阻塞此内置对象,这是不可取的(需要使用它的代码将调用您的函数,这是不兼容的并且具有不同的目的)。

答案 3 :(得分:0)

您可以使用算术进行数字模式检查,并将结果保持为数字:

var minNr = 0; // it does not help to put 4 zeroes here.
var maxNr = 10000;
var prefix = 7199;

function Nummer(min,max) {
    for (var guld_nr = min; guld_nr < max; guld_nr++) {
        if (Math.floor(guld_nr/100) === guld_nr % 100 ) {
            $(".resultat").append((prefix * 10000 + guld_nr) + "<br>");
        }
    }
}

Nummer(minNr, maxNr);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="resultat"></div>

你的代码的问题是当较低的数字针对正则表达式进行测试时,它们被隐式转换为字符串,并且没有得到前缀的零,因此它们在正则表达式上失败。

无论如何,代码在坚持数字而不是字符串时会更有效率,所以我建议一直使用数字直到在浏览器中输出它们。

这段代码效率更高:

var minNr = 0; // it does not help to put 4 zeroes here.
var maxNr = 10000;
var prefix = 7199;

function Nummer(min,max) {
    var test = Math.floor(min/100)*100 + Math.floor(min/100)%100;
    var guld_nr = test < min ? test + 101 : test;
    for (; guld_nr < max; guld_nr+=101) {
        $(".resultat").append((prefix * 10000 + guld_nr) + "<br>");
    }
}

Nummer(minNr, maxNr);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="resultat"></div>