【问题标题】:object access vs array access in javascriptjavascript中的对象访问与数组访问
【发布时间】:2018-07-10 09:04:34
【问题描述】:

我有一系列数据,它的大小逐渐增加。我想用它的 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]

编辑:我在某处读到,向现有对象添加新属性的成本太高。

【问题讨论】:

    标签: javascript arrays performance object


    【解决方案1】:

    如果您期待执行搜索操作,那么您应该使用Object,因为与Array 中的搜索相比,它提供了更好的性能。

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

    【讨论】:

    • 向现有对象添加新属性的成本不会降低其访问时间的效率,还是吗?
    • @MohammadHomayooni - 在添加的情况下也不会出现性能问题。此外,对于edit,Object 可以为您提供更好的性能。
    【解决方案2】:

    在第一个示例中,每次使用 Find 时都必须迭代数组。

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

    【讨论】:

      【解决方案3】:

      从对象读取速度更快,并且需要 O(1) 时间,就像 @NikhilAggarwal 刚才所说的那样。 但是最近在看V8优化,想查一下,所以用了benchmark 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

      【讨论】:

        猜你喜欢
        • 2018-05-27
        • 2014-05-02
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 2013-12-02
        • 2016-01-31
        相关资源
        最近更新 更多