JavaScript中的数组效率与对象效率

我有一个可能包含数千个对象的模型。我想知道什么是最有效的方式来存储它们并在获得ID后检索单个对象。ID是长数字。

这些是我正在考虑的两个选项。在选项一中,它是一个带有递增索引的简单数组。在选项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];

}

}

选项2与关联数组:

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为键的数组或对象)中,什么表现更好?

而且,如果我必须多次对列表进行排序,答案是否会改变?

回答:

简短的版本:数组通常比对象快。但是,没有100%正确的解决方案。

更新-测试和结果

var a1 = [{id: 29938, name: 'name1'}, {id: 32994, name: 'name1'}];

var a2 = [];

a2[29938] = {id: 29938, name: 'name1'};

a2[32994] = {id: 32994, name: 'name1'};

var o = {};

o['29938'] = {id: 29938, name: 'name1'};

o['32994'] = {id: 32994, name: 'name1'};

for (var f = 0; f < 2000; f++) {

var newNo = Math.floor(Math.random()*60000+10000);

if (!o[newNo.toString()]) o[newNo.toString()] = {id: newNo, name: 'test'};

if (!a2[newNo]) a2[newNo] = {id: newNo, name: 'test' };

a1.push({id: newNo, name: 'test'});

}

测试设置 试验结果

原始帖子-说明你的问题中存在一些误解。

Javascript中没有关联数组。仅数组和对象。这些是数组:

var a1 = [1, 2, 3];

var a2 = ["a", "b", "c"];

var a3 = [];

a3[0] = "a";

a3[1] = "b";

a3[2] = "c";

这也是一个数组:

var a3 = [];

a3[29938] = "a";

a3[32994] = "b";

它基本上是一个带有孔的数组,因为每个数组的确具有连续索引。它比没有孔的阵列要慢。但是,手动遍历数组甚至更慢(大多数情况下)。

这是一个对象:

var a3 = {};

a3[29938] = "a";

a3[32994] = "b";

以上是 JavaScript中的数组效率与对象效率 的全部内容, 来源链接: utcz.com/qa/430961.html

回到顶部