循环未定义的数组键

时间:2015-11-02 15:32:52

标签: javascript arrays

问题:

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

我想生成一段时间内的表现。

要实现这一目标,我会遍历查询结果,并++计算一个级别和日期的练习。

示例:2级练习于2015年11月1日进行。 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个键。 然后,在添加所有条目后,我将使用

循环遍历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:/

问题:

如果在那里有未定义的键之间,我怎样才能找到数组和循环中的最高键? 我怎样才能将所有未定义的密钥添加到最高(而不是更多)?

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

谢谢:)

1 个答案:

答案 0 :(得分:5)

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

作为测试:

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

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

相关问题