【问题标题】:Javascript loop unexpected behaviorJavascript循环意外行为
【发布时间】:2014-12-21 15:33:08
【问题描述】:

这是我的函数,它应该将字符串分成每组 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];
    }
}

【问题讨论】:

  • 已编辑问题,请再次阅读
  • Here's sample data to test 013192002197143 012419001189107 012419002540761 012420002277776 012421009834353 013192002197143 012419001189107 012419002540761 012420002277776 012421009834353 P.S.每个数字都在新行上

标签: javascript loops for-loop


【解决方案1】:

将您的代码更改为:

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

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

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

【讨论】:

  • 这个正在打印 9 个条目,将第二组中的最后一个条目留给 10 个条目的样本,理想情况下应该是 2 组,每组 5 个
【解决方案2】:

这是一种扩展 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 = "";
    }
}

【讨论】:

    【解决方案3】:

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

    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

    【讨论】:

      【解决方案4】:

      您不需要额外的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)

      【讨论】:

        【解决方案5】:

        错误原因是在第五次循环结束时counter的值变成2,因为每次循环后计数器都会增加,所以只要满足if条件就可以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);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多