为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript中的数组与对象效率

JavaScript中的数组与对象效率

幕布斯7119047 2019-08-26 14:31:30
JavaScript中的数组与对象效率我有一个可能有数千个物体的模型。我想知道什么是最有效的存储方式和一旦我拥有它的id后检索单个对象。id是长号。所以这些是我想到的两个选项。在选项1中,它是一个带有递增索引的简单数组。在选项2中,它是一个关联数组,也许是一个对象,如果它有所不同。我的问题是哪一个更有效,当我主要需要检索单个对象,但有时也循环遍历它们并进行排序。选项一,非关联数组:var a = [{id: 29938, name: 'name1'},          {id: 32994, name: 'name1'}];function getObject(id) {     for (var i=0; i < a.length; i++) {         if (a[i].id == id)              return a[i];     }}选项二与关联数组:var a = [];  // maybe {} makes a difference?a[29938] = {id: 29938, name: 'name1'};a[32994] = {id: 32994, name: 'name1'};function getObject(id) {     return a[id];}更新:好的,我知道在第二个选项中使用数组是不可能的。因此,第二个选项的声明行应该是:var a = {};并且唯一的问题是:在检索具有给定id的对象时表现更好:数组或id为关键字的对象。而且,如果我必须多次对列表进行排序,答案会改变吗?
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

它根本不是一个性能问题,因为数组和对象的工作方式非常不同(或至少应该如此)。数组具有连续索引0..n,而对象将任意键映射到任意值。如果想提供特定按键,唯一的选择是一个对象。如果你不关心键,那就是一个数组。

如果您尝试在数组上设置任意(数字)键,则确实会导致性能下降,因为在行为上,数组将填充中间的所有索引:

> foo = [];
  []> foo[100] = 'a';
  "a"> foo  [undefined, undefined, undefined, ..., "a"]

(请注意,数组实际上并不包含99个undefined值,但它会以这种方式运行,因为您[应该] 在某个时刻迭代数组。)

这两个选项的文字应该非常清楚如何使用它们:

var arr = ['foo', 'bar', 'baz'];     // no keys, not even the option for it
var obj = { foo : 'bar', baz : 42 }; // associative by its very nature


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 394 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号