【问题标题】:Filtering 2D Array with a Variable Filter使用变量过滤器过滤二维数组
【发布时间】:2019-04-12 20:52:53
【问题描述】:

我正在尝试将一个数组拆分为几个不同的数组,以便将信息粘贴到多个工作表中。我无法使用单独的数组 (sheetCheck) 动态过滤我的主数据数组 (bigArray)。如果我输入一个静态过滤器,即“02A”,过滤器就会起作用。如何修改我的过滤器以接受可变信息?

function testArray (){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  //Get full array of Budget Pricing Breakdown Sheet
  var originalArray = ss.getRangeByName('XxTestRange').getValues();
  //Delete unused columns from array. Only Leaves sheetNumber, description, qty, UM, unitCost
  var newArray = originalArray.map(function(row){return[row[0],row[5],row[6],row[7],row[10]];});
  //Delete unused rows that have a value of X in the sheetNumber
  var bigArray = newArray.filter(function(item){return item[0] != "X";});

  //Get array of Applicable Tabs
  var originalSheetsArray = ss.getRangeByName('XxTestRange2').getValues();
  //Remove unused column
  var newSheetsArray = originalSheetsArray.map(function(row){return[row[0],row[2]];});
  //Delete not applicable rows
  var sheetCheckBad = newSheetsArray.filter(function(item){return item[1] != "Not Applicable"});
  //Separate just appicable trades
  var sheetCheck = sheetCheckBad.map(function(row){return[row[0]];});

  for (var i=0; i<sheetCheck.length;i++){
    var sheetNumber = sheetCheck[i];
    //Logger.log(sheetNumber)
    var pasteArray = bigArray.filter(function(item, sheetNumber){return item[0] == sheetNumber})
    //var pasteArray = bigArray.filter(filterSheetLogic)
    Logger.log(sheetNumber);
    Logger.log(pasteArray);
  }
}

//Pull individual Arrays based on sheet numbers
var filterSheetLogic = function(item, sheetNumber){
  if (item[0] == sheetNumber){
    return true;
  } else {
    return false;
  }
}

【问题讨论】:

  • 为了正确了解您的情况,您能否提供您想要的输入和输出的示例值?
  • 我相信 OP 正在询问如何能够将变量 sheetnumber 作为函数参数包含在 var pasteArray = bigArray.filter(function(item, sheetNumber){return item[0] == sheetNumber}) 中,因为粘贴数组当前在所有迭代中都是空的。如果删除变量 sheetNumber,则该函数可以正常工作。我只用了 11 列数字。
  • 这里是一个示例电子表格的链接。我正在使用数组过滤器将预算定价明细表中的数据分解为单独的数组,这些数组可以粘贴到标题为 02A、03A、...、04A 的其他表中。该工作表的完整版本从预算定价明细中复制了数百行并将它们分配到 100 多张工作表中。 link
  • @Cooper 你是绝对正确的。删除 sheetNumber 变量解决了我的问题。感谢您的帮助!

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


【解决方案1】:

你不能这样称呼

 bigArray.filter(function(item, sheetNumber) ...

因为过滤器的回调有自己的参数。在这种情况下,sheetNumber 始终等于数组的索引 012 等。

我的案例是构建一个结构来生成一个有效的回调。举个例子

/**
 * The big array filter's builder. It's a fabric
 * @param {string} sheetNumber
 * @returns {object} The filter's callback
 */
var filterBuilder_ = function(sheetNumber) {
  return function(item, _, __) {
    return item[0] == sheetNumber;
  };
};

在此之后将您的主循环更改为

for (var i = 0; i < sheetCheck.length; i++) {
  var sheetNumber = sheetCheck[i][0];
  var bigArrayfilter = filterBuilder_(sheetNumber);
  var pasteArray = bigArray.filter(bigArrayfilter);
  Logger.log(sheetNumber);
  Logger.log(pasteArray);
}

如果我没有正确理解任务,我深表歉意。

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 2019-09-04
    • 2011-05-24
    • 2018-12-28
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多