【问题标题】:Push Array to Nested Array将数组推送到嵌套数组
【发布时间】:2016-12-02 23:01:05
【问题描述】:

我正在尝试将一个数组推送到 Google Apps 脚本中的另一个数组中。我正在从电子表格(数组数组)中提取数据,执行相对于另一个数组的匹配,然后希望将该匹配中的相应值传递到新数组中。新数组需要与原始数组(数组的数组)具有相同的结构。我没有任何运气得到这个结果。我试图“推送”匹配数组,但我要么得到一个巨大的数组,要么得到一个与原始数组结构不匹配的较小数组的数组。当我尝试使用基于原始数组循环的索引时,我得到一个“TypeError”。

  /*
    Step 1 - Read All Data Into An Array

  */

  //Gets Client Data For Each Firm
  mysheet = ss.getSheetByName(sheetNames[1]); //Adjusted worksheet
  ss.setActiveSheet(mysheet);
  arrInput = ss.getRangeByName(rngNameRawClientType).getValues(); 

  //Gets Client Classifcation and Score Data 
  mysheet = ss.getSheetByName(sheetNames[2]); //Data Validation worksheet
  ss.setActiveSheet(mysheet);
  arrClassification = ss.getRangeByName(rngNameClient).getValues();

  /*

    Step 2 - Perform Calculations on the Data

  */

   //Iterate Through Raw Data Input Array (Rows) 
   for(var r = 0; r < arrInput.length; r++) {

    //Iterate Through Column of Each Row
    for(var c = 0; c < arrInput[r].length; c++) {
       var strClientType = arrInput[r][c];

      //Compare To Classification Array - Return Corresponding Score
      var matchScores = [];
      for(var z = 0; z < arrClassification.length-1; z++) {
        if(arrClassification[z][0] === strClientType) {          
          //Add Score to Scores Array
          matchScores.push(arrClassification[z][1]);       
        }
      }
    }
     scores.push(matchScores);

【问题讨论】:

  • 您能否发布两个数组和所需输出的示例?

标签: javascript multidimensional-array google-apps-script


【解决方案1】:

您需要在两个 for 循环 (scoreRow) 之间创建一个空数组,并在每次增加 c 时将值推入该数组。 然后每次增加rscores.push(scoreRow)

for(var r = 0; r < arrInput.length; r++) {
  var scoreRow = []
  //Iterate Through Column of Each Row
  for(var c = 0; c < arrInput[r].length; c++) {
    var strClientType = arrInput[r][c];

    //Compare To Classification Array - Return Corresponding Score
    var matchScores = [];
    for(var z = 0; z < arrClassification.length-1; z++) {
      if(arrClassification[z][0] === strClientType) {          
        //Add Score to Scores Array
        matchScores.push(arrClassification[z][1]);       
      }
    }
    scoreRow.push(matchScores);
  }
  scores.push(scoreRow);
}

【讨论】:

  • 谢谢,这行得通。我稍微改变了查找以运行得更快。遍历分类数组花费的时间太长。
【解决方案2】:

const filterData = (data, filters) =>
  data.map((column) => 
    column.filter((row) => 
      !filters.includes(row)))



const inputData = [
  ['a', 'b', 'c'],
  ['a', 'b', 'c'],
  ['a', 'b', 'c'],
  ['a', 'b', 'c']
]
const inputFilters = ['b']

const output = filterData(inputData, inputFilters)



console.log(output)

我认为这就是您正在寻找的。 它是用 ES6 语法编写的。

(Arrow) Function filterData 接受两个参数,输入数据和定义的过滤器。

Array map 每次迭代都会返回一个新数组,结果是

Array filter 作为结果返回新数组

Array includes 调用 filtersrow 作为参数

希望有帮助!

【讨论】:

  • 谢谢,我对 ES6 不太熟悉,但这看起来很干净
猜你喜欢
  • 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
相关资源
最近更新 更多