繁体   English   中英

JavaScript循环意外行为

[英]Javascript loop unexpected behavior

这是我的功能,应该将字符串分成5行,但以某种方式将循环显示意外行为,并且alert(data)打印4个而不是5个字符串。 阿美我在这里想念什么吗?

function returnwasset(somedata) {
    alert(somedata);
    var lines = somedata.split('\n');
    var counter = 1;
    var data = "";
    for (var i = 0; i < lines.length; i++, counter++) {
        if (counter % 5 === 0) {
            alert(data);
            data = "";
            counter = 1;
        }
        data = data + "\n" + lines[i];
    }
}

将您的代码更改为:

data=data+"\n"+lines[i];
if(counter%5===0)
{
    alert(data);
    data="";
    counter=1;
}

因此,您首先附加数据,然后显示该数据。 一旦循环退出,您应该检查计数器变量是否有少于5的最后几行,例如:

if (counter < 5) {
    alert(data);
}

尝试使用下面的函数以预定义的编号显示您的字符串。 行。 它会将您的完整字符串分成五行。

function returnwasset(somedata){
    var lines = str.split(' ');
    var wordsperline = parseInt(lines.length / 5);
    var finalline = parseInt(lines.length % 5);
    //alert(lines.length);
    var result = "";
    var counter = 0;
    for(var i = 0; i < 5; i++){
        if(i != 4){
            for(var j = 0; j < wordsperline; j++){
                result += lines[counter] + " ";
                counter++;
            }
            result += "\n";
        }
        else{
            for(var k = 0; k < (wordsperline + finalline); k++){
                result += lines[counter] + " ";
                counter++;
            }          
        }
    }

    alert(result);
}

jsFiddle

您不需要额外的counter ,可以使用迭代索引进行数学运算。

 var testData = '013192002197143 012419001189107 012419002540761 012420002277776 012421009834353 013192002197143 012419001189107 012419002540761 012420002277776 012421009834353'.split(' ').join("\\n"); function returnwasset(somedata) { alert(somedata); var lines = somedata.split("\\n"); var data = ""; for(var i = 0; i < lines.length; i++) { data += lines[i] + "\\n"; if(i % 5 === 4) { alert(data); data = ""; } } } returnwasset(testData) 

错误的原因是当第五个循环结束时, counter值变为2 ,因为每个循环后计数器都会增加,因此,如果满足条件,则使counter = 0 因此,当第五个循环完成时, counter的值将为1 :-

 var a = '013192002197143\\n012419001189107\\n012419002540761\\n012420002277776\\n012421009834353\\n013192002197143\\n01241900118910\\n012419002540761\\n012420002277776\\n012421009834353'; function returnwasset(somedata) { alert(somedata); var lines = somedata.split('\\n'); var counter = 1; var data = ""; for (var i = 0; i < lines.length+1; i++, counter++) { data = data + "\\n" + lines[i]; if (counter % 5 === 0) { alert(data); data = ""; counter = 0; } } } window.onload = returnwasset(a); 

这是一种扩展了almas的思想并消除了循环后对counter变量或额外代码的需求的方法。

只需将您的for循环替换为此:

for (var i = 0; i < lines.length; i++) {
    data += lines[i] + "\n";
    if ((i % 5 === 0 && i > 0) || (i + 1) === lines.length) {
        alert(data);
        data = "";
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM