将具有唯一ID的对象的集合存储为以ID为键的关联数组而不是作为常规数组来存储对象有什么陷阱吗?

Che*_*aks 1 javascript arrays associative-array

我一直遵循Backbone Collection的约定,即拥有数据对象数组,并使用_.find / findWhere等遍历该数组,即使我没有使用Backbone时也是如此。但是,如果我知道它们将是唯一的,则将它们存储为一个以id为键的关联数组似乎会更有效。有没有我看不到的陷阱?

T.J*_*der 5

所以基本上:

var map = {};
map["someId"] = someObject;
map["someOtherId"] = someOtherObject;

// ...later to get the object:
var o = map["someId"];
Run Code Online (Sandbox Code Playgroud)

如果是这样,那么“是否有任何陷阱...我没有看到”的答案是“否”:在对象上查找属性是一种非常常见的操作,JavaScript引擎可以非常快速地执行此操作。

事实上,由于普通的JavaScript数组是不是真的在所有的阵列,它的显着更有效地寻找事情了这种方式,而不是在阵列存储它们,并使用forEach或类似的找到他们。每当您从数组(例如,a[0]或其他)获得条目时,这就是属性访问操作,就像在对象中查找属性一样。(事实上,这正是它是什么,禁止JavaScript引擎知道它可以优化操作。)在新的一个获取元素类型化数组 速度更快,因为它们实际上是数组(尽管对它们的搜索仍然很简单),但是从标准数组中获取元素是对对象的属性查询,因此您最好只进行一次查询(在地图上,使用您的密钥)代替。


(附带说明:在JavaScript中,通常不使用术语“关联数组”。它只是一个对象。有时您还会听到“ map”。)