构建和更新数组对象

时间:2017-03-28 12:53:06

标签: javascript

我正在开发一个简单的注册系统,显示特定工作室中可用的座位数。它内置在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。该脚本正在运行,但我想知道这是否应该压缩成一个循环以及为什么。我知道“最佳实践”是主观的,但构建一个数组只是为了在同一个函数中立即重新打开它感觉多余。

2 个答案:

答案 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