Javascript递归遍历数组

时间:2018-07-10 13:12:25

标签: javascript for-loop while-loop momentjs

尝试在javascript中映射项目列表时遇到了一个问题。我要映射以下数组:

from django.contrib.auth import views as auth_views

urlpatterns = [
    path('login/', auth_views.login, {'redirect_authenticated_user': True}, name='login'),
]

基本上,这是每个项目的保留列表。所有时间都以毫秒为单位在UNIX代码中。我没有尝试将时间转换为正确时间的问题,但是我需要检查连续几个小时的预订时间。预约总是一个小时,因此我想将之前预约之后的预约映射到以前的预约中,这样就形成了多个小时的预约。因此,如果清单中10点,11点和12点包含3个针对10-07-2018的保留,则应将这些保留合并在一个对象中。

新数组应如下所示:

[{"project_id":"EGNL1701","title":"Test Energy Project",
"reservations": 
 [{"start_time":"1519887600000"},{"start_time":"1519891200000"},    
 {"start_time":"1519938000000"},{"start_time":"1519898400000"},        
 {"start_time":"1519902000000"},{"start_time":"1519905600000"}, 
 {"start_time":"1519909200000"},{"start_time":"1529683200000"}, 
 {"start_time":"1529686800000"},{"start_time":"1531893600000"}, 
 {"start_time":"1531897200000"},{"start_time":"1531900800000"}, 
 {"start_time":"1531904400000"}]}, 
{"project_id":"LENL1701","title":"Vive","reservations":[]}]

我不确定最好的方法是什么,我试图弄乱while和for循环来完成它,但是我一直陷入无限循环。 这是我现在用于检查下一个预约是否在循环中当前预约之后一小时的代码:

     [
        {
            title: 'Energy Project',
            startTime: 1530631437,
            endTime: 1530638640
        },
        {
            title: 'HTC VIVE',
            startTime: 1530794845,
            endTime: 1530797390
        }
    ];

我希望你们中的一个人对如何做到这一点有个好主意?我觉得我要解决所有这些错误。这是一个React项目,我可以使用ES6函数等。

3 个答案:

答案 0 :(得分:0)

这可能不是完整的答案,所以请尝试

  • 创建一个空的预订对象R
  • 循环浏览(对于或针对)直到倒数第二个项目。您可以检查下一个项目是否存在。
  • 检查例如下一个标准是否在当前标准之后一小时,然后将它们加在一起并添加到R中。
  • R的结束时间将成为当前预订或其旁边的结束时间。
  • 移动到下一个或根据您在上一步中所做的操作跳过。
  • 到达最后一项时,只需将其添加到R(如果未在上一步中添加)。

一种假设是所有保留都是有序的。您可以通过排序功能对它们进行排序,以避免循环并检查其适合位置。

答案 1 :(得分:0)

我已使用@Farrukh Subhani的建议解决了此问题。 首先必须对列表进行排序,然后循环遍历两次。结果代码:

data

非常感谢这个建议,它使我走上了正轨:)

答案 2 :(得分:0)

我觉得这可能很适合array.reduce,尽管这可能源于我的个人品味。该解决方案可以而且应该简化和清理,但是我试图传达总体思路,因此我使生产代码显得更加冗长。

const input = [{"project_id":"EGNL1701","title":"Test Energy Project","reservations": 
  [{"start_time":"1519887600000"},{"start_time":"1519891200000"},    
  {"start_time":"1519938000000"},{"start_time":"1519898400000"},        
  {"start_time":"1519902000000"},{"start_time":"1519905600000"}, 
  {"start_time":"1519909200000"},{"start_time":"1529683200000"}, 
  {"start_time":"1529686800000"},{"start_time":"1531893600000"}, 
  {"start_time":"1531897200000"},{"start_time":"1531900800000"}, 
  {"start_time":"1531904400000"}]}, 
  {"project_id":"LENL1701","title":"Vive","reservations":[]}]

const hourInMilliseconds = 3600000

console.log(input.reduce((acc, project) => {
    const title = project.title
    const sortedReservations = project.reservations.map(r => r.start_time).sort()
    const reservationCount = sortedReservations.length
    const earliest = reservationCount > 0 ? sortedReservations[0] : "none"
    const latest = reservationCount > 0 ? sortedReservations[reservationCount - 1] : "none"
    const projectObject = {
      title,
      startTime: earliest,
      endTime: isNaN(latest) ? latest : (Number(latest) + hourInMilliseconds).toString()
    }

    acc.push(projectObject)
    return acc
  }, [])
)

免责声明:这假设一个数组项中的所有保留都是连续的,在示例数据中似乎就是这种情况。如果不是这种情况,则必须对功能进行一些更改。