0

Я пытаюсь нажать массив в другой массив в Google Apps Script. Я извлекаю данные из таблицы (массив массивов), выполняя сопоставление с другим массивом, а затем пытаюсь передать соответствующее значение из этого совпадения в новый массив. Новый массив должен иметь ту же структуру, что и исходный массив (массив массивов). Мне не удавалось получить такой результат. Я попытался «нажать» массив совпадений, но я либо получаю один гигантский массив, либо массив меньших массивов, которые не соответствуют структуре исходного массива. Когда я попытался использовать индекс, основанный на цикле исходного массива, я получаю «TypeError».Push Array to Nested Array

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

Не могли бы вы привести примеры обоих массивов и требуемого выхода? – Bardy

ответ

0

Вам нужно создать пустой массив между двумя для петель (scoreRow) и нажать значение в этот массив каждый раз, когда вы увеличиваете гр. Затем каждый раз, когда вы увеличиваете r scores.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); 
} 
+0

Спасибо, это сработало. Я немного изменил внешний вид, чтобы работать быстрее. Зацикливание по шкале классификации происходило слишком долго. – Vince

0

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) FunctionfilterData принимает два аргумента, входные данные и определенные фильтры.

Array map на каждой итерации возвращает новый массив, в результате

Array filter возвращает новый массив в результате

Array includes призвал filters с row в качестве аргумента

Надежда, что помогает!

+0

Спасибо, я не так знаком с ES6, но это выглядит довольно чисто – Vince