循环未定义的数组键

use*_*706 0 javascript arrays

问题:

我有一个DB包含数学练习,按难度级别和日期分割.

我想生成一段时间的性能图表.

为了达到这个目的,我遍历查询结果,以及++进行练习的级别和日期的计数器.

例如:2级练习于2015年11月1日进行. this.levels[2].daysAgo[1].amountTaken++;

有了这个,我可以构建一个图表,其中第0天始终是今天,并且显示了几天的表现.

现在levels []有一个预定义的级别,所以没有问题.但DAYSAGO []是非常动态的(它甚至使用相同的数据每天都在变化),所以如果只有一个运动拍摄,它会徘徊每天的基础上(从是daysAgo[0]daysAgo[1]等).在daysAgo[]这之间是空的(因为没有条目).

但是为了评估图表,我需要它们具有初始化状态amountTaken: 0,等等.

问题是:我不知道什么时候最古老的运动.

想法1:

首先收集一种代理对象中的所有条目,其中我有一个var maxDaysAgo保存最旧练习的值,然后daysAgo[maxDaysAgo]在插入实际条目之前初始化一个填充0条目的数组.

这看起来非常笨拙而且过于复杂

想法2:

只需添加条目this.level[level].daysAgo[daysAgo].amountTaken++;,可能会使daysAgo数组中包含许多undefined键.然后,在添加所有条目之后,我将循环遍历daysAgo

for (var i = 1; i < this.maxLevel; i++) {                       // for every level
  for (var j = 0; j < this.levels[i].daysAgo.length; j++) { 
Run Code Online (Sandbox Code Playgroud)

daysAgo.length不会计算未定义的字段,是吗?

所以,如果我在[24]只有一个条目,length仍然是1:/

题:

我怎样才能找到数组中的最高键并循环,直到那里存在未定义的键?我怎样才能将所有未定义的密钥添加到最高位置(而不是更多)?

或者:完全解决整个问题会有什么不同,更优雅的方式?

谢谢 :)

Jam*_*rdy 5

array.length返回一个高于最高数字索引的值,因此可用于循环甚至未定义的值

作为测试:

var a=[]
a[24]=1
console.log(a.length)
Run Code Online (Sandbox Code Playgroud)

为我输出25(在chrome和firefox中).