1

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

4

1 回答 1

5

所以基本上:

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

// ...later to get the object:
var o = map["someId"];

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

事实上,由于普通的 JavaScript 数组根本不是真正的数组,因此以这种方式查找比将它们存储在数组中并使用或类似方法来查找它们明显更有效。forEach每次从数组(例如,a[0]或其他)中获取条目时,这就是一个属性访问操作,就像在对象中查找属性一样。(事实上​​,这正是它的本质,除非 JavaScript 引擎知道它可以优化操作。)从一个新的类型化数组中获取一个元素更快,因为它们确实是数组(尽管通过它们进行搜索仍然很重要),但是从标准数组中获取元素是对对象的属性查找,因此您不妨只进行一次查找(在您的地图上,使用您的密钥)代替。


(旁注:在 JavaScript 中,通常不使用术语“关联数组”。它只是一个对象。有时您还会听到“映射”。)

于 2013-05-22T07:39:14.397 回答