Javascript:以时间戳为键的数组

Javascript: Array with Timestamp as keys

本文关键字:数组 时间戳 Javascript      更新时间:2023-09-26

我想要一个数组,其中时间戳作为键,数字作为值。通过这种方式,我想跟踪有多少辆汽车进入或离开停车场,以及有多少辆汽车同时停在停车场。

基本:- 获取停车操作列表,包括每笔交易的输入日期和退出日期- 将所有这些日期放入一个数组中,其中时间戳作为键,如果输入日期,则为 += 1,退出日期为 -=1- 按日期排序- 浏览排序数组并添加到计数器,跟踪是否达到新的最大值

    var result = [];
    var counter = 0;
    var max = 0;
    //SELECT enterTS, exitTS FROM parking;
    // validated, that works
    while (!rs.eof) {   
        var es = rs.fields(1).toString();
        var dd = rs.fields(2).toString();
        result[es] += 1;     //might happen at the same time with exit or other entries
        result[dd] -= 1;
        alert('Start' + es); //correct timestamp
        alert('Array' + result[es]); //shows NaN
    }
    result.sort();
    for (var key in result) {            
          counter += result[key];
          if(counter > max){
               max = counter;
          }
    }

感谢您的任何帮助。我知道这不是一个有效的代码片段,但是如果没有数据连接,这很棘手。我已经尝试了关联数组,但无法理解如何在此示例中使用。

再次感谢,FJ

使用对象,而不是数组。

var result = {};

现在要填充它,您只需:

result[es] = result[es] + 1 || 1

你的for...in循环应该工作(但为了理智,你应该使用.hasOwnProperty(。

for (var key in result) {        
    if (result.hasOwnProperty(key)) {    
        counter += result[key];
        if(counter > max){
             max = counter;
        }
    }
}

您的NaN结果是因为您正在这样做:

result[es] += 1;

由于result[es]是未定义的(因为您从未为其赋值(,因此undefined + 1 NaN(不是数字(。

您不能将字符串用作数组的索引;这相当于将数组用作对象。即使可以,逻辑也是错误的,因为对数组进行排序会排序值,而不是索引。

我建议您创建一个停车事件对象数组,并使用自定义比较函数对其进行排序。像这样的东西(未经测试(:

var result = [];
var counter = 0;
var max = 0;
//SELECT enterTS, exitTS FROM parking;
// validated, that works
while (!rs.eof) {   
    var es = rs.fields(1).toString();
    var dd = rs.fields(2).toString(); // I'm assuming this is the exit time
    // create two events: one for entry and one for exit
    result.push({time: es, change: 1});
    result.push({time: dd, change: -1});
}
// sort based on event time
result.sort(function(a, b){ return a.time.localeCompare(b.time); });
// scan events, tracking current parking population
for (var key in result) {         
      counter += result[key].change;
      if(counter > max){
           max = counter;
      }
}