问题:
我有一个包含数学练习的数据库,按难度级别和上课日期划分。
我想随时间生成性能图。
为此,我遍历了查询结果,并在++
计数器中进行了练习的水平和日期。
例如: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/