问题:

我有一个包含数学练习的数据库,按难度级别和上课日期划分。

我想随时间生成性能图。

为此,我遍历了查询结果,并在++计数器中进行了练习的水平和日期。

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

有了这个,我可以建立一个图表,其中今天总是第0天,并显示了几天的性能。

现在,levels []具有预定义的级别数,因此这没有问题。
但是daysAgo []是非常动态的(即使使用相同的数据,它甚至每天都会变化),因此,如果仅进行一次锻炼,则每天都会漫游(从daysAgo[0]daysAgo[1],依此类推)。
之间的daysAgo[]将为空(因为没有条目)。

但是为了评估该图,我需要它们具有amountTaken: 0,的初始化状态,依此类推。

问题是:我不知道最早的锻炼是什么时候。

想法1:

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

看起来很笨拙而且过于复杂

想法2:

只需添加条目this.level[level].daysAgo[daysAgo].amountTaken++;,可能会使daysAgo数组保留很多undefined键。
然后,在添加所有条目之后,我将使用

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


但是daysAgo不会计算未定义的字段,对吗?

因此,如果我在[24]处只有一个条目,则daysAgo.length仍为1:/

题:

我如何找出数组中最高的键并循环直到最高的键(当它们之间存在未定义的键时)?
我如何才能解决所有未定义的密钥,直到达到最高级别(并且不再限制)?

或者:完全解决这个整体问题的另一种更优雅的方式是什么?

谢谢 :)

最佳答案

array.length返回比最高数字索引高一个的数字,因此即使未定义的值也可以用于循环

作为测试:

var a=[]
a[24]=1
console.log(a.length)


为我输出25(Chrome和Firefox)。

关于javascript - 遍历未定义的数组键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33481240/

10-13 05:00