2015-10-19 56 views
0

此刻我正在使用对象来模拟关联数组。 对象就像一个一对多的关系表从MySQL 例如:JavaScript“关联”对象与阵列

var obj = { 
    105: [], 
    200: [] 
    //... 
} 

我的属性名称是唯一的数字,所以我发现我可以用一个数组,太。 但是,索引之间的空条目填充undefined

var arr = []; 
arr[10] = "Value"; 
arr[15] = "Value 2"; 
//arr => [undefined*10, "Value", undefined*4, "Value 2"] 

因此,当我要迭代该数组时,我必须检查当前索引值是否已设置。

所以问题是,哪个解决方案更快或更好。 使用一个对象或数组,其中 指针之间的空白区域填充了undefined值。

+0

http://stackoverflow.com/a/8067678/3166303 – leeor

+0

在你的案例对象应该使用更少的内存。迭代两个结构大部分是相同的,但是您必须记住,JavaScript中的对象属性没有顺序。 – VisioN

+0

[查看此链接的问题](http://stackoverflow.com/questions/17295056/array-vs-object-efficiency-in-javascript) –

回答

2

如果您需要键值关联,则需要一个对象。
如果你想要一个有序列表其中的密钥并不重要,它是一个数组。仅供参考,数组中的指标“之间”集合索引实际上并未用undefined填充;当您尝试任何物体上访问一个不存在的属性,你只是得到undefined值:

({}).foo; // undefined 
0

你问这是“更快,更好”。对于“更好”,存在许多可能的答案,但“更快”具有更清晰的答案:正如其他人指出的那样,ObjectArray之间几乎没有速度差。两者在原型层次结构中都有相同的根。 Array的空值不是“填充的”。

关于您的使用案例,瓶颈不会是对象,而是您如何循环它!这实际上是确实有所作为:for循环比任何其他循环方式都快。但是你有非连续数字指数的问题。

因此:刚才基准,如果你做

  • for(key in object)
  • keys = Object.keys()for(var i = 0; i < keys.length; i++)

因为这两个应该是最快的选择需要多长时间。