2017-03-28 68 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因为对我个人来说可以更容易地思考问题,如果我不是专注于指数。另外,由于您正在更新会话的每个值,您可以将其保留在第一个循环中。从我的理解你真正想要做的是获取座位数据,然后基于另一个数据集(我可能是错的,我还没有测试或运行此代码与任何数据)的计数