2016-12-02 145 views
0

我正試圖將數組推送到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); 
+0

你可以發佈這兩個陣列的例子和所需的輸出? – Bardy

回答

0

您需要在兩個for循環(scoreRow)之間創建一個空數組,並在每次增加c時將值推送到該數組中。 然後每次增加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回報新陣列的結果作爲號召filters

Array includes結果,與row作爲參數

希望幫助!

+0

謝謝,我不熟悉ES6,但這看起來很乾淨 – Vince