0

对于我的应用程序,我需要一个可以通过键进行快速迭代和快速查找的集合。

示例数据

var data = [
   { myId: 4324, val: "foo"},
   { myId: 6280, val: "bar"},
   { myId: 7569, val: "baz"},
   ... x 100,000
];

密钥包含在我要存储的对象中。我一起破解了Harray(哈希数组)https://gist.github.com/3451147

这是你如何使用它

// initialize with the key property name
var coll = new Harray("myId");
// populate with data
data.forEach(function(item){ coll.add(item); });
// key lookup
coll.h[4324] // => { myId: 4324, val: "foo"}
// array functionality
coll[1] // => { myId: 6280, val: "bar"}
coll.map(function(item){ return item.val; }); // => ["foo", "bar", "baz"]
coll.length // => 3
// remove value
coll.remove(coll[0]); // delete => { myId: 4324, val: "foo"}
// by key
coll.removeKey(7569) // delete => { myId: 7569, val: "baz"}
// by index
coll.removeAt(0); // delete => { myId: 6280, val: "bar"}

删除速度似乎是我能看到的唯一权衡。h Object存储的对象在 the和 the之间共享,Array所以我不存储任何东西的 2 个副本。

问题

  1. 我应该坚持使用for in来遍历对象属性吗?
  2. 保留对象键的数组而不是对象本身?
  3. 其他选择?

注意:浏览器兼容性不是一个因素。这仅适用于 chrome。

4

1 回答 1

1

为了了解特定集合是否有用,您必须:

  • 首先验证是否存在性能问题。如果它足够快,请不要担心。要检查这一点,假设整个页面很慢,请使用Chrome 分析器之类的分析器来检查问题是否在您当前使用的集合中

  • 然后检查您正在构建的备用集合真的更快。为此,一个常见的解决方案是使用http://jsperf.com/之类的网站(或简单地构建您自己的定时测试),使用足够大的数据集对这两个解决方案进行基准测试。

只有在那之后,您才应该努力确保您的解决方案是 API 完整的、完全没有错误的(使用测试单元)等等。

执行我首先提到的两项检查可能会防止无用的工作,因为 V8 引擎中的标准对象非常快速和智能。

于 2012-08-24T15:10:42.423 回答