首页 > 解决方案 > 为什么最终数组返回最后一个数组的 7 行编译而不是 Google Apps 脚本中的 7 个唯一数组值?

问题描述

抱歉,我对此很陌生,但我做了额外的演员,需要获取我工作的人员和类型的统计信息,并希望构建模板,以便我以后可以参考它来开始计算和显示统计信息。

我的代码:

function myFunction ()  {
  var UNIQUE_ETHNIC = ["w","b","h","a","m","e","o"];
  var UNIQUE_GENDER = ["m","f"];
  var UNIQUE_AGE = ["20","30","40","50","60","70"];
  var egaArray =  calculateEga(UNIQUE_ETHNIC, UNIQUE_GENDER, UNIQUE_AGE); 
}

function calculateEga(ethnicUnique, genderUnique, ageUnique) {  
  var returnedArray = [[],[]];
  var tempArray = [];
  for (eU = 0; eU < ethnicUnique.length; eU++) {
    var columnCounter = 0;
    for (gU = 0; gU < genderUnique.length; gU++) {    
      for (aU = 0; aU < ageUnique.length; aU++) {
        tempArray[columnCounter] = ethnicUnique[eU]+genderUnique[gU]+ageUnique[aU];
        columnCounter++; //used so male & female on one line
        }
    }
    Logger.log(tempArray); //this gives the right array here each time
    returnedArray[eU] = tempArray; 
    //returnedArray[eU] = ['ega: '+tempArray];  //outputs what I kind of need

  }
  Logger.log(returnedArray); // 7 dupes of the last compiled array
  return returnedArray;
}

--- 第一个 Logger.log 吐出正确的 tempArray 值,但是一旦我将它们粘贴到返回的数组中,它只会给我最后一个编译数组的 7 个重复值,因此最后一个 Logger.log 给出了这个:

[[om20,om30,om40,om50,om60,om70,of20,of30,of40,of50,of60,of70],

[om20、om30、om40、om50、om60、om70、of20、of30、of40、of50、of60、of70],

[om20、om30、om40、om50、om60、om70、of20、of30、of40、of50、of60、of70],

[om20、om30、om40、om50、om60、om70、of20、of30、of40、of50、of60、of70],

[om20、om30、om40、om50、om60、om70、of20、of30、of40、of50、of60、of70],

[om20、om30、om40、om50、om60、om70、of20、of30、of40、of50、of60、of70],

[om20,om30,om40,om50,om60,om70,of20,of30,of40,of50,of60,of70]]

但是,如果我使用注释掉的'ega:'调用,我会更接近我的目标版本:

[例如:wm20,wm30,wm40,wm50,wm60,wm70,wf20,wf30,wf40,wf50,wf60,wf70],

[例如:bm20,bm30,bm40,bm50,bm60,bm70,bf20,bf30,bf40,bf50,bf60,bf70],

[例如:hm20,hm30,hm40,hm50,hm60,hm70,hf20,hf30,hf40,hf50,hf60,hf70],

[例如:am20,am30,am40,am50,am60,am70,af20,af30,af40,af50,af60,af70],

[例如:mm20,mm30,mm40,mm50,mm60,mm70,mf20,mf30,mf40,mf50,mf60,mf70],

[例如:em20,em30,em40,em50,em60,em70,ef20,ef30,ef40,ef50,ef60,ef70],

[例如:om20,om30,om40,om50,om60,om70,of20,of30,of40,of50,of60,of70]]

想要获得更高版本,但没有'ega:'

感谢您在这里的任何帮助!

标签: arraysgoogle-apps-script

解决方案


我认为在您的情况下,tempArray可能会将值returnedArray作为引用传递放入数组中。从您的样本值来看,所有值似乎都是tempArray. 通过这种方式,当'ega: '+tempArray使用时,将运行按值传递并获得预期的数组。我认为这可能是您的问题的原因。在这种情况下,如何进行以下修改?

从:

returnedArray[eU] = tempArray; 

至:

returnedArray[eU] = tempArray.slice();

或者

returnedArray[eU] = tempArray.concat();

或者

returnedArray[eU] = [...tempArray];
  • 在这种情况下,我认为其他方法也存在。

测试:

function myFunction() {
  var UNIQUE_ETHNIC = ["w", "b", "h", "a", "m", "e", "o"];
  var UNIQUE_GENDER = ["m", "f"];
  var UNIQUE_AGE = ["20", "30", "40", "50", "60", "70"];
  var egaArray = calculateEga(UNIQUE_ETHNIC, UNIQUE_GENDER, UNIQUE_AGE);
  console.log(egaArray)
}

function calculateEga(ethnicUnique, genderUnique, ageUnique) {
  var returnedArray = [[], []];
  var tempArray = [];
  for (eU = 0; eU < ethnicUnique.length; eU++) {
    var columnCounter = 0;
    for (gU = 0; gU < genderUnique.length; gU++) {
      for (aU = 0; aU < ageUnique.length; aU++) {
        tempArray[columnCounter] = ethnicUnique[eU] + genderUnique[gU] + ageUnique[aU];
        columnCounter++;
      }
    }
    returnedArray[eU] = tempArray.slice();
  }
  return returnedArray;
}

myFunction();

参考:


推荐阅读