当前位置: 首页 > 面试题库 >

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

羊舌高峰
2023-03-14
问题内容

我有一个可能包含数千个对象的模型。我想知道什么是最有效的方式来存储它们并在获得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";


 类似资料:
  • 我正在编写一个游戏,想用一个数组来表示一个棋盘。我正在寻找效率,因为我要做许多迭代。在这种情况下,无论是int数组还是char数组对于棋盘表示都很方便。在int数组和char数组中做运算,效率上有区别吗? 我怀疑,因为char数组的每个元素的大小都是1字节,所以它可能会因为内存中的不同表示而变慢(考虑一台现代计算机,它至少有32位用于int表示)...我说的对吗? 先谢谢你。 编辑:我将生成游戏树

  • 我更多地练习对象、数组和方法。现在我正在编写一个简单的簿记程序来添加一本书,按标题、作者、价格、库存编号和流派搜索书籍。我有几个问题,一是修复这个程序(在方法fillBook()中添加一本书),二是如何从对象类中删除一本书,三是如何使这个程序更高效 目前正在研究和阅读ioexception类。 这是我得到的错误java:66:错误:类手册中的构造函数手册不能应用于给定的类型 Book tempBo

  • 据说Java的默认序列化机制效率不高,因为a)它通过反射发现要写入/读取哪些字段,这通常很慢b)它将额外的数据写入流。 提高效率的一种方法是实现Externalizable及其writeExternal/readExternal方法。 问题是:如果我改为提供“writeObject/readObject”方法,并且不在其中调用deafiltWriteObject/defaultReadObject

  • 问题内容: 我不确定这个问题是否与语言无关,因此我将以Java问题的身份提出。如果你有这样的循环 循环的每次迭代都在创建新的内存空间吗?如果是这样,是否要处理旧空间?如果没有,做这样的事情更有效吗 编辑:更新了代码以更好地说明问题 问题答案: 简短的答案:即使在Java中进行开发时,也不要理会这些事情,即使这些问题中的大多数都是由JVM自己处理的。 垃圾收集器将知道该怎么做,并将根据情况尝试做最好

  • 问题内容: 假设您有一个非常简单的数据结构: …并且您想将其中一些存储在javascript变量中。如我所见,您有三个选择: 如果您要存储(或希望可能拥有)多个“价值”部分(例如,增加他们的年龄等),显然第二或第三种选择是可行的,因此,为了论证,让我们假设在此结构中再也不需要任何数据值了。您选择哪一个,为什么? 编辑 :该示例现在显示最常见的情况:非顺序ID。 问题答案: 每个解决方案都有其用例。

  • 问题内容: 在数组中对对象进行分组的最有效方法是什么? 例如,给定此对象数组: 我正在表格中显示此信息。我想对不同的方法进行分组,但是我想对这些值求和。 我将Underscore.js用于其groupby函数,这很有用,但并不能解决所有问题,因为我不希望它们“分裂”而是“合并”,更像SQL 方法。 我正在寻找的是能够总计特定值(如果要求)。 因此,如果我进行了groupby ,我希望收到: 如果我