我正在开发一个简单的注册系统,显示特定工作室中可用的座位数。它内置在Google Apps脚本中,使用JavaScript语法运行。
我为用户在登录时构建了一个Class
对象数组。其中一个对象键是seats
,它显示了研讨会中剩余的可用点数。为此,我比较了主类列表,以获得当前注册列表的最大注册人数。
类对象
[{
date: 4/10/2017,
title: "Workshop 1",
desc: "A string description for 1",
seats: ""
}]
Google表格
| 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;
}
该函数将在4/10日期返回18,在5/10日期返回24。该脚本正在运行,但我想知道这是否应该压缩成一个循环以及为什么。我知道“最佳实践”是主观的,但构建一个数组只是为了在同一个函数中立即重新打开它感觉多余。
答案 0 :(得分: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
因为对我个人而言,如果我不关注索引,就会更容易思考问题。此外,由于您再次更新会话的每个值,您可以将其保留在第一个循环中。根据我的理解,你真正想做的就是获取座位数据,然后根据另一个数据集合计算(我可能错了,我没有测试或运行任何数据的代码)。
答案 1 :(得分:0)
用户类表的设计很糟糕,因为您无法轻松容纳接受3个类的用户。以下是优选的,也将使代码更容易:
| user | class |
|-------|-----------|
| user1 | 4/10/2017 |
| user2 | 4/10/2017 |
| user2 | 5/10/2017 |
| | |
此外,请不要使用count
并使用--sessions[i].seats;
作为sessions[i].seats
== count