2017-03-28 72 views
0

我正在研究一個簡單的註冊系統,該系統顯示特定工作室中可用座位的數量。它內置在使用JavaScript語法運行的Google Apps腳本中。構建和更新數組對象

我在登錄時爲用戶構建了一個Class對象的數組。其中一個對象鍵是seats,它顯示了車間中剩餘的點的可用數量。爲了達到這個目的,我比較了主要類別列表,以便將最大註冊人數量提供給當前註冊列表。

類對象

[{ 
    date: 4/10/2017, 
    title: "Workshop 1", 
    desc: "A string description for 1", 
    seats: "" 
}] 

谷歌表表

| date  | title  | description    | seats | | 
|-----------|------------|----------------------------|-------|---| 
| 4/10/2017 | Workshop 1 | A string description for 1 | 20 | | 
| 5/10/2017 | Workshop 2 | A string description for 2 | 25 | | 

當前註冊記憶

| user | class0 | class1 | 
|-------|-----------|-----------| 
| user1 | 4/10/2017 |   | 
| user2 | 4/10/2017 | 5/10/2017 | 
|  |   |   | 

腳本

// Set the count variable 
    var count; 

    // Sessions the user is not registered for 
    for(var i=0; i<sessions.length; i++) { 

    // Look the class up in the master list 
    for(var j=0; j<allSessionsData.length; j++) { 

     // Find the stored date in the master list 
     var date = allSessionsData[j][0]; 

     // match the session dates to find the max seats 
     if(sessions[i].date === date) { 
     sessions[i].seats = allSessionsData[j][5]; 
     } 
    } 
    } 

    // Reopen the sessions loop to get the current counts 
    for(var i=0; i<sessions.length; i++) { 
    var count = sessions[i].seats; 

    // Get the current 2D registrations array 
    for(var j=0; j<allRegsData.length; j++) { 
     for(var k=0; k<allRegsData[j].length; k++) { 

     if(sessions[i].date === allRegsData[j][k]) { 
      count--; 
      sessions[i].seats = count; 
     } 
     } 
    } 
    } 
    // Return the updated array 
    return sessions; 
} 

函數將返回18爲5/10 4/10日期和24。該腳本正在工作,但我想知道這是否應該濃縮成一個循環,爲什麼。我知道「最佳實踐」是主觀的,但是構建一個數組只是爲了在同一個函數中立即重新打開它是多餘的。

+0

添加數據示例將有助於 – binariedMe

+1

您可以將'sessions [i] .seats = count;'移出雙循環,並將其放置在主循環結束之前。或者你可以沒有計數,並使用'--sessions [i] .seats;' – Adder

回答

0

用戶類表的設計不好,因爲您無法輕鬆地容納擁有3個類的用戶。以下是優選的,也將導致更容易代碼:

| user | class  | 
|-------|-----------| 
| user1 | 4/10/2017 |  
| user2 | 4/10/2017 | 
| user2 | 5/10/2017 | 
|  |   | 

而且,這樣做沒有count,並使用--sessions[i].seats;作爲sessions[i].seats == count

+0

是的,這是一個粗略的第一遍。現在,電子表格中的一個「對象」形式作爲一行發送。我需要添加一個循環來將它們添加到表單中。 – Brian

1

這是我怎麼會重構它,這是絕對主觀的,但我喜歡用es6,因爲它很容易在眼睛上。

function refactor(sessions) { 

    // Sessions the user is not registered for 
    sessions.forEach(session => { 

    // update seats based on allSessionsData 
    allSessionsData.forEach(sessionData => { 
     if (session.date === sessionData[0]) { 
     sessions.seats = sessionData[5]; 
     } 
    }); 

    // update seats based on allRegsData 
    allRegsData.forEach(allRegs => { 
     allRegs.forEach(reg => { 
     if (session.date === reg) { 
      session.seats--; 
     } 
     }); 
    }); 

    }); 

    return sessions; 
} 

所以我刪除了for循環和使用foreach因爲對我個人來說可以更容易地思考問題,如果我不是專注於指數。另外,由於您正在更新會話的每個值,您可以將其保留在第一個循環中。從我的理解你真正想要做的是獲取座位數據,然後基於另一個數據集(我可能是錯的,我還沒有測試或運行此代碼與任何數據)的計數