【问题标题】:JavaScript Nested for showing wrong resultsJavaScript 嵌套显示错误结果
【发布时间】:2014-09-30 03:52:29
【问题描述】:

我在处理这段代码时遇到了问题,无法弄清楚。它似乎是添加到“数据”而不是像它应该的那样从“数据”中添加“票证”。在 Google Script 中使用代码

function consolidate(){
  var data = [[1,1,1,1,1,1],[1,1,1,1,1,1],[1,2,1,2,1,2],[1,2,1,2,1,2],[1,1,1,1,1,1],[1,2,1,2,1,2],[1,1,1,1,1,1],[1,2,1,2,1,2],[1,2,1,2,1,2]];
  var ticket = [];
  ticket[0] = data[0];
  for(var x=0;x<data.length;x++){
    for(var i=0;i<ticket.length;i++){
      if(ticket[i][0]==data[x][0]&&ticket[i][1]==data[x][1]&&ticket[i][2]==data[x][2]&&ticket[i][4]==data[x][4]){
        ticket[i][3]=ticket[i][3]+data[x][3];
        ticket[i][5]=ticket[i][5]+data[x][5];
        break;
      } 
    }
    ticket[i]=data[x];
  }
}

我的数据结果是 [[1, 1, 1, 3, 1, 3], [1, 1, 1, 2, 1, 2], [1, 2, 1, 4, 1, 4], [1, 2, 1, 4, 1, 4], [1, 1, 1, 2, 1, 2], [1, 2, 1, 4, 1, 4], [1, 1, 1, 1, 1, 1], [ 1, 2, 1, 4, 1, 4], [1, 2, 1, 2, 1, 2]] 但数据不应该改变

【问题讨论】:

  • 如果ticket[i]=data[x];i 循环之外,它的用途是什么?
  • 数据会改变,因为通过ticket[0] = data[0];,您实际上是在分配一个对象引用。
  • 好吧,这是有道理的。我试图将第一行数据设置为票证以启动循环。谢谢!

标签: javascript for-loop nested-loops


【解决方案1】:
function consolidate(){
  var data = [[1,1,1,1,1,1],[1,1,1,1,1,1],[1,2,1,2,1,2],
              [1,2,1,2,1,2],[1,1,1,1,1,1],[1,2,1,2,1,2],
              [1,1,1,1,1,1],[1,2,1,2,1,2],[1,2,1,2,1,2]];
  var ticket = [];
  ticket[0] = data[0].slice();
  for(var x = 0; x < data.length; x++) {
    for(var i = 0; i < ticket.length; i++) {
        for(var k = 0; k < 5; k++) {
         if (ticket[i][k] != data[x][k])
             break;
         else if (k != 4)
             continue;
         ticket[i][3] += data[x][3];
         ticket[i][5] += data[x][5];
      } 
    }
    ticket[i] = data[x].slice();
  }  
  console.log(data);
}

consolidate();

【讨论】:

  • 所以这不是我们想要完成的。我们正在搜索“数据”行。当我们在“列”0、1、2 和 4 找到类似的数据时。然后我们将“数据”中的“列”3 和 5 添加到“票”的相同列中。如果循环找不到像 0、1、2 和 4 的“列”,则将向“票证”添加一个新行,类似于“数据”中的该行。因此,我们应该以更少的行结束,并且“列”0、1、2 和 4 相同的一些行将在“列”3 和 5 中添加总计
【解决方案2】:

这就是我得到的并且有效的地方。如果有更好的方法请告诉我

function consolidate1(){// put data in here <-----()
  var data = [[1,1,1,1,1,1],[2,1,1,1,1,1],[1,1,1,1,1,1],[2,1,1,1,1,1],[1,1,1,1,1,1],[3,1,1,1,1,1],[1,1,1,1,1,1],[3,1,1,1,1,1],[1,1,1,1,1,1]];
  var ticket = [];
  ticket[0]=[];
  ticket[0][0]=data[0][0];
  ticket[0][1]=data[0][1];
  ticket[0][2]=data[0][2];
  ticket[0][3]=data[0][3];
  ticket[0][4]=data[0][4];
  ticket[0][5]=data[0][5];
  for(var x=1;x<data.length;x++){ //get all the unique rows based on columns 0,1,2,4 
  var indicator = 0;
    for(var i=0;i<ticket.length;i++){
      if(ticket[i][0]==data[x][0] && ticket[i][1]==data[x][1] && ticket[i][2]==data[x][2] && ticket[i][4]==data[x][4]){
        ticket[i][3]=ticket[i][3]+data[x][3];
        ticket[i][5]=ticket[i][5]+data[x][5];
        indicator = 1;
        break;
      }
    }
    if(indicator==0){
      ticket[i]=[];
      ticket[i][0]=data[x][0];
      ticket[i][1]=data[x][1];
      ticket[i][2]=data[x][2];
      ticket[i][3]=data[x][3];
      ticket[i][4]=data[x][4];
      ticket[i][5]=data[x][5];
    }
  }
  Logger.log(ticket);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2017-03-08
    • 2011-05-17
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多