与哈希表相比,通过循环访问数组中对象的Javascript优化

Javascript optimization accessing an object in an array though a loop compared to a hash table

本文关键字:数组 对象 优化 Javascript 访问 循环 哈希表      更新时间:2023-09-26

我有一个元素数组,如下所示:

myArray = [{name:'john',age:25},
           {name:'marta',age:20},
           {name:'pedro',age:22}]

我的程序一秒钟要访问一个对象好几次它的名字。我定义了这个函数:

function getPersonByName(name){
    for (var i=0; i<myArray.length; ++i)
        if (myArray[i].name == name)
            return myArray[i]
}
var john = getPersonByName('john');

但每次运行的循环似乎并不有效。相反,我可以创建一个关联对象的哈希表,并保持更新:

var hash = {john:myArray[0], marta:myArray[1], pedro:myArray[2]}
var john = hash["john"]

但我不知道javascript的散列访问是如何定义的,那么,第二种方法真的更快吗?

实现这一点的最简单方法是缓存函数的结果,正如John Resig在学习高级javascript 时所解释的那样

你的功能看起来像这个

function getPersonByName(name){
    if (getPersonByName.cache[name]) {
        return getPersonByName.cache[name];
    } else {
       for (var i=0; i<myArray.length; ++i)
           if (myArray[i].name == name) {
               getElements.cache[name] = myArray[i];
               return getPersonByName.cache[name];
           }
    }
}
getPersonByName.cache = {};
var john = getPersonByName('john');

John Resig几年前的统计数据显示,使用这种方法而不是使用直接DOM访问,性能提高了约7倍,这是一种在JQuery库中集成了很多的技术。

jsPerf 上提供了不同循环数组方式的性能测试

根据这些基准测试,您可以使用获得更好的性能

function getPersonByName(name){
  for (var i<myArray.length; i--;)
    if (myArray[i].name == name)
      return myArray[i]
 }

将myArray[i]存储在变量中可能会带来额外的好处,从而避免必须多次查找它。只是要小心在循环之外声明那个变量。

function getPersonByName(name){
  var obj;
  for (var i<myArray.length; i--;)
    obj = myArray[i];
    if (obj.name == name)
      return obj;
 }

jsPerf上的另一个基准测试表明,数组比对象更快。

没有一个基准可以完全复制您的使用。您可以在jsPerf上创建一个自定义测试。如果你不想在那里注册,你可以在jsdoit上使用quickbenchmark演示,或者下载许多性能/基准测试javascript库中的一个。在github上搜索基准来定位它们。