我有一个包含数学练习的数据库,按难度级别和日期分割。
我想生成一段时间内的表现。
要实现这一目标,我会遍历查询结果,并++
计算一个级别和日期的练习。
示例:2级练习于2015年11月1日进行。
this.levels[2].daysAgo[1].amountTaken++;
有了这个,我可以建立一个图表,其中第0天始终是今天,并且显示了几天的表现。
现在levels []具有预定义的级别,因此没有问题。
但是daysAgo []是非常动态的(它甚至每天都会使用相同的数据进行更改),所以如果只进行一次练习,它会每天徘徊(从daysAgo[0]
到daysAgo[1]
等等)。
它之间的daysAgo[]
是空的(因为没有条目)。
但是为了评估图表,我需要它们具有amountTaken: 0,
的初始化状态,依此类推。
首先收集一种代理对象中的所有条目,其中我有var maxDaysAgo
保存最旧练习的值,然后初始化一个填充0条目的数组daysAgo[maxDaysAgo]
插入实际的条目。
这看起来非常笨拙和过于复杂
只需添加条目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++) {
但是daysAgo.length
不计算未定义的字段,是吗?
所以如果我在[24]只有一个条目,length
仍然是1:/
如果在那里有未定义的键之间,我怎样才能找到数组和循环中的最高键? 我怎样才能将所有未定义的密钥添加到最高(而不是更多)?
或者:完全解决整个问题会有什么不同的,更优雅的方式?
谢谢:)
答案 0 :(得分:5)
array.length返回高于最高数字索引的值,因此可用于循环甚至未定义的值
作为测试:
var a=[]
a[24]=1
console.log(a.length)
为我输出25(在chrome和firefox中)。