JavaScript";联想;对象与数组

JavaScript";联想;对象与数组,javascript,arrays,object,Javascript,Arrays,Object,目前,我正在使用一个对象来模拟一个关联数组。 该对象的行为类似于mysql中的一对多关系表 例如: var obj = { 105: [], 200: [] //... } 我的属性名只是数字,所以我发现我也可以使用数组。 但是,索引之间的空条目将填充未定义的 var arr = []; arr[10] = "Value"; arr[15] = "Value 2"; //arr => [undefined*10, "Value", undefined*4, "Value 2"

目前,我正在使用一个对象来模拟一个关联数组。 该对象的行为类似于mysql中的一对多关系表 例如:

var obj = {
  105: [],
  200: []
  //...
}
我的属性名只是数字,所以我发现我也可以使用数组。 但是,索引之间的空条目将填充
未定义的

var arr = [];
arr[10] = "Value";
arr[15] = "Value 2";
//arr => [undefined*10, "Value", undefined*4, "Value 2"]
因此,当我要迭代该数组时,我必须检查当前索引处的值是否已设置

所以问题是,哪种解决方案更快或更好。 使用对象或数组,其中
索引之间的空白处填充了未定义的值。

如果需要键值关联,则需要对象。
如果您想要一个键并不重要的有序列表,那么它就是一个数组

仅供参考,数组中“介于”集合索引之间的索引实际上并没有用
未定义的
填充;当您尝试访问任何对象上不存在的属性时,只会获得
未定义的
值:

({}).foo; // undefined
你在问哪个“更快或更好”。“更好”有很多可能的答案,但“更快”有一个更清晰的答案:正如其他人指出的那样,
Object
Array
之间几乎没有任何速度差异。两者在原型层次结构中具有相同的根。
数组的空值不是“填充”的

关于您的用例,瓶颈将不是对象,而是您如何循环它这实际上是有区别的:
for
循环比任何其他循环方式都快。但是你有一个非连续数字索引的问题

因此:如果你这样做的话,只需基准测试需要多长时间

  • 用于(输入对象)
  • keys=Object.keys()
    for(var i=0;i

因为这两个应该是您最快的选择。

在您的情况下,对象可能会使用更少的内存。迭代这两种结构基本上是相同的,但是您必须记住JavaScript中的对象属性没有顺序。