Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.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 Google应用程序脚本-ForEach在范围内_Javascript_Foreach_Google Apps Script - Fatal编程技术网

Javascript Google应用程序脚本-ForEach在范围内

Javascript Google应用程序脚本-ForEach在范围内,javascript,foreach,google-apps-script,Javascript,Foreach,Google Apps Script,对于一个范围中的每一行,我想根据int的值在一行的列中向数组添加一个或多个条目。 例如,如果我的行是: Val1 1 Val1 2 我想把一个对象{Val1,'US'}推到我的数组中。 另一方面,如果我的行是: Val1 1 Val1 2 我想将两个对象:{Val1,'FR'},{Val1,'DE'}推送到我的数组中。 我不明白为什么以下代码不起作用: var range = sheet.getRange("A2:B"); var results = range.

对于一个范围中的每一行,我想根据int的值在一行的列中向数组添加一个或多个条目。 例如,如果我的行是:

Val1   1
Val1   2
我想把一个对象{Val1,'US'}推到我的数组中。 另一方面,如果我的行是:

Val1   1
Val1   2
我想将两个对象:{Val1,'FR'},{Val1,'DE'}推送到我的数组中。 我不明白为什么以下代码不起作用:

  var range = sheet.getRange("A2:B");
  var results = range.getDisplayValues();
  var array = [];

  results.forEach(function(row){          

    switch(row[1]){
      case '1' :               
        row[1] = "US";        
        array.push(row);                        
        break;
      case '2' :
        row[1] = "FR";
        array.push(row);      
        row[1] = "DE";
        array.push(row);     
        break; 
      case '3' :
        var entry1 = row;
        var entry2 = row;
        entry1[1] = "UK";
        entry2[1] = "SW";
        array.push(entry1);      
        array.push(entry2);      
        break;            
    }           
  });    
return array;
这会返回我两次“DE”和两次“SW”。在案例三中,我尝试了一种不同的方法,以确保问题不在变量引用中,但同样的情况也会发生。这可能是因为我在价值观上循环的方式吗?为什么会这样


谢谢你的帮助

这是因为JS推送一个随后被修改的变量,所以该值被替换到所有地方

尝试像这样直接推送,而不存储:

  var range = sheet.getRange("A2:B");
  var results = range.getDisplayValues();
  var array = [];

  results.forEach(function(row){          

    switch(row[1]){
      case '1' :               
        array.push([row[0],"US"]);                        
        break;
      case '2' :
        array.push([row[0],"FR"]);      
        array.push([row[0],"DE"]);     
        break; 
      case '3' :
        array.push([row[0],"UK"]);      
        array.push([row[0],"SW"]);      
        break;            
    }           
  });    
return array;
您正在原地修改“行”,而不制作副本。也就是说,您将对“row”(同一数组)的引用放入多个位置,然后再次修改“row”——从而覆盖您原来的更改

为了避免此问题,可以使用Array.slice()创建行的副本,如下所示:

var range = sheet.getRange("A2:B");
var results = range.getDisplayValues();
var array = [];

results.forEach(function(row) {
  switch(row[1]) {
    case '1' :
      // No copy necessary, since you're only using it once              
      row[1] = "US";
      array.push(row);
      break;
    case '2' :
      // Copy not necessary for the first use
      row[1] = "FR";
      array.push(row);
      // Copy here, since you will modify it again
      row = row.slice();
      row[1] = "DE";
      array.push(row);
      break; 
    case '3' :
      // Make one extra copy
      var entry1 = row;
      var entry2 = row.slice();
      entry1[1] = "UK";
      entry2[1] = "SW";
      array.push(entry1);
      array.push(entry2);
      break;
  }
});
return array;

请注意,对于在推送的数组中只有两个元素的情况,为每种情况构建新的数组(如另一个答案所示)可能更好。若我打算在性能不是很关键的生产代码中使用它,我可能会为每次修改制作一个副本,而不是在您需要上面的变体时。我上面所写的方式演示了必要的副本(以便更容易理解这一点),但通过更改使其不正确要比防御性地复制所有内容容易得多。

您能为输入/输出添加示例值吗?现在还不太清楚您希望输出是什么,所以这意味着当您将变量推送到数组时,变量仍在作用域中?啊哈Js。。。