JavaScript中的对象访问与数组访问

时间:2018-07-10 09:04:35

标签: javascript arrays performance object

我有一系列数据,并且它的大小逐渐增加。我想查找其ID的数据的特定行。我有两个选择。首先:创建一个数组,然后将每行添加到该数组中,每次我想要一行时,只需搜索数组中的项目或使用数组原型函数(查找)。另一个选择是创建一个对象,每次出现新行时,只需将该行添加为属性(属性名称将为该行的ID)。当我想查找一行时,只需通过其名称(Id)获取该对象的属性即可。现在我想知道哪种选择是最有效的方法? (或者还有第三种选择?)

第一个选项:

const array = [  
       {  
          "Id":15659,
          "FeederCode":169,
          "NmberOfRepetition":1
       },
       {  
          "Id":15627,
          "FeederCode":98,
          "NmberOfRepetition":2
       },
       {  
          "Id":15557,
          "FeederCode":98,
          "NmberOfRepetition":1
       }
    ]

每次出现新行时,都会将新行推入此数组。 访问权限:array.find(x => x.Id === 15659)

第二个选项:

const object =   {  
       15659:{  
          "Id":15659,
          "FeederCode":169,
          "NmberOfRepetition":1
       },
       15627:{  
          "Id":15627,
          "FeederCode":98,
          "NmberOfRepetition":2
       },
       15557:{  
          "Id":15557,
          "FeederCode":98,
          "NmberOfRepetition":1
       }
    }

每次出现新行时,都会向该对象添加一个新属性。 访问权限:object[15659]

编辑:我在某处读到,将新属性添加到现有对象会带来太多成本。

3 个答案:

答案 0 :(得分:3)

如果您希望执行搜索操作,则应使用Object,因为与Array中的搜索相比,它可以提供更好的性能。

Object中的搜索复杂度为O(1),而Array中的搜索复杂度为O(n)。因此,要获得更好的性能,应使用Object

答案 1 :(得分:1)

在第一个示例中,每次使用“查找”时,您都必须迭代数组。

在第二个示例中,无论其中有多少项,您都将直接访问属性,这将导致O(1)执行时间始终固定。因此,为了获得更好的性能,您应该选择第二种方式

答案 2 :(得分:1)

从对象读取更快,并且需要O(1)时间,就像@NikhilAggarwal刚刚说的那样。 但是最近我正在阅读有关V8优化的内容,并希望进行检查,因此使用基准js进行确认。

这是我的发现-

obj或arr中的条目数:100000

  1. 从Obj提取操作的次数: 47,174,859 ops / sec
  2. 从阵列进行搜索的次数: 612 ops / sec

如果我们减少条目的数量-对象的操作次数几乎保持不变,但数组的操作呈指数增长。

obj或arr中的条目数:100

  1. 从Obj提取操作的次数: 44,264,116 ops / sec
  2. 从阵列进行搜索的次数: 520,709 ops / sec

obj或arr中的条目数:10

  1. 从Obj提取操作的次数: 46,739,607 ops / sec
  2. 从数组进行搜索的次数: 3,611,517 ops / sec