Фильтрация 2D-массива с помощью фильтра переменных - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь разбить массив на несколько разных массивов, чтобы вставить информацию на несколько листов.У меня проблемы с фильтрацией основного массива данных (bigArray) динамически с отдельным массивом (sheetCheck).Если я набираю статический фильтр, т. Е. "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;
  }
}

1 Ответ

1 голос
/ 13 апреля 2019

Вы не можете назвать это

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

Потому что обратный вызов фильтра получает свои собственные аргументы. В этом случае sheetNumber всегда равен индексу массива 0, 1, 2 и т. Д.

В моём случае строится структура для генерации правильного обратного вызова. Для примера

/**
 * 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);
}

Прошу прощения, если не правильно понял задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...