Javascript:以时间戳为键的数组
我想要一个数组,时间戳作为键,数字作为值。通过这种方式,我想跟踪有多少辆车进入或离开了停车场,以及有多少辆车同时停在停车场 基本知识: -获取包含每个事务的输入日期和退出日期的停车操作列表 -将所有这些日期放入一个数组,时间戳作为键,如果输入日期,则+=1,退出日期为-=1 -按日期排序 -检查排序数组并添加到计数器,跟踪是否达到新的最大值Javascript:以时间戳为键的数组,javascript,arrays,associative-array,Javascript,Arrays,Associative Array,我想要一个数组,时间戳作为键,数字作为值。通过这种方式,我想跟踪有多少辆车进入或离开了停车场,以及有多少辆车同时停在停车场 基本知识: -获取包含每个事务的输入日期和退出日期的停车操作列表 -将所有这些日期放入一个数组,时间戳作为键,如果输入日期,则+=1,退出日期为-=1 -按日期排序 -检查排序数组并添加到计数器,跟踪是否达到新的最大值 var result = []; var counter = 0; var max = 0; //SELECT enter
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
)
您的NaN
结果之所以出现,是因为您正在执行以下操作:
result[es] += 1;
由于
result[es]
是未定义的(因为您从未给它赋值),undefined+1
是NaN
(不是数字)。您不能使用字符串作为数组的索引;这相当于将数组用作对象。即使可以,逻辑也是错误的,因为对数组排序是对值排序,而不是对索引排序
我建议您创建一个停车事件对象数组,并使用自定义比较函数对其进行排序。类似这样(未经测试):
还要检查
.hasOwnProperty
@domokun:True,我编辑了答案以包含它。我不想混淆这个问题,但值得一提的是,如果没有更多的工作,这将无法完成工作,因为您无法对对象键进行排序。在结果中使用var键进行迭代
将不会以正确的顺序生成值。@TedHopp:在需要时将对象转换为排序数组是相当简单的。这真的取决于什么更重要。排序性能或查找性能。OP似乎正在努力解决的问题是找到同时停放的最大车辆数。你的代码不能做到这一点。我不认为将对象转换成一个排序数组来完成这项工作是“微不足道的”,但是,这并不是“键控”过时的。查找特定日期的条目将更加困难(尽管排序会有所帮助)。OP并没有真正提供足够的上下文来确定这可能有多重要。@MattBurland-在OP的问题中,目标是计算有多少停车事件(一个小问题,因为这只是检索到的记录数),并找到同时停车的最大数量。如果按日期查找很重要,则需要另一个数据结构(或者,更可能的情况是,只需查找此算法的数据来自的底层数据库)。
result[es] += 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(); // 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;
}
}