【问题标题】:Can I get the benefits of both, objects and arrays in JavaScript?我可以同时获得 JavaScript 中的对象和数组的好处吗?
【发布时间】:2014-02-19 13:31:06
【问题描述】:

我有部分数据标记有 ID,分布在不同的集合中。

我需要直接使用 ID 访问这些数据,但我还需要非常快速地循环数据。

var listOfPartA = { 
  34523: { foo: 7, bar: 123},
  6435: { foo: 2, bar: 163},
  3123: { foo: 3, bar: 223},
  ... 
};

var listOfPartB = { 
  34523: { baz: 1},
  6435: { baz: 4},
  3123: { baz: 6},
  ... 
};

如果我需要为 Id 获取特定的数据部分,它会很快,但如果我尝试循环所有数据部分,它会很慢。

var listOfPartA = [ 
  { id: 34523, foo: 7, bar: 123},
  { id: 6435, foo: 2, bar: 163},
  { id: 3123, foo: 3, bar: 223},
  ... 
];

var listOfPartB = [ 
  { id: 34523, baz: 1},
  { id: 6435, baz: 4},
  { id: 3123, baz: 6},
  ... 
];

如果我想为这些对象的 ID 获取特定的数据部分,它会很慢,因为我必须手动搜索它们,但如果我遍历所有数据部分,它会很快。

不能快速直接访问和快速迭代吗?

【问题讨论】:

  • 你总是可以同时使用两者。数组是通过引用分配的,因此内存开销很小。
  • 在同一数据上使用两者。关键字:索引结构 ;)
  • 如果我想删除所有ID的数据怎么办?我可以在对象中快速完成,但数组不会以死引用结束吗?
  • 我的意思是删除一个 ID 的所有数据部分...

标签: javascript arrays performance object


【解决方案1】:

预索引您的数组:

var listOfPartA = [
    {id:34523, foo:7 bar:123},
    ...
];

var lookupPartA = {};
listOfPartA.forEach(function(x,i) {lookupPartA[x.id] = i;});

现在,您可以使用listOfPartA 数组快速循环,还可以快速查找:

listOfPartA[lookupPartA[34523]]

【讨论】:

  • 不是必须是[x.id] - 除了干得好hashindex :)
【解决方案2】:

预索引您的对象:

var lookupPartA = { 
  34523: { foo: 7, bar: 123},
  ... 
};

var listOfIds = Object.keys(lookupPartA);

现在,您可以在lookupPartA 对象中快速找到 id,还可以快速循环:

for (var i=0, l=listOfIds.length; i<l; i++)
    lookupPartA[listOfIds[i]]

【讨论】:

  • 这是一个测试,其中 object.keys 没有太多好处:jsperf.com/performance-of-array-vs-object/17
  • @K..:请注意,您不必每次循环数组时都执行Object.keys,只有在插入/删除键时才执行。尽管如此,令人惊讶的是它比for in-loop 更快:-)
  • 啊,你的意思是,测试中的性能损失来自Object.keys
【解决方案3】:

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多