【问题标题】:fast way in javascript to update existing array with new valuesjavascript中用新值更新现有数组的快速方法
【发布时间】:2015-10-05 18:38:33
【问题描述】:

我从一个包含嵌套对象(约 34,000 个项目)的大数组开始,我每 5 秒轮询一次,接收对数组的更新(通常一次更新 2-3 个),新数组只包含已更改的项目(例如,如果仅更改了 3 个项目,我只会在更新后的数组中获取这 3 个项目。)

我使用下划线尝试了以下操作,但最多需要 9 秒,我需要 1 秒或更短的时间。

  getUniqueUnion(new, old) {
    return uniq(union(new, old), false, function(item) {
      return item.info.id;
    }); 
  }

有人对快速方法有建议吗?如果有帮助,唯一键将是 info.id,而我真正想要检测的唯一更改(我需要更新项目的原因)是 inStock 值是否更改。换句话说,如果 inStock 值没有改变,我不需要对该数组项进行任何更新。

示例数组:

const originalData = [
  {
    info: {
      id: 1
    },
    moreInfo: {
      name: 'hamburger',
      inStock: true
    }
  },
  ... // 33,999 more
]



const updatedData = [
  {
    info: {
      id: 1
    },
    moreInfo: {
      name: 'hamburger',
      inStock: false
    } 
  },
  ... // maybe 2 more
]

所以最终的数组将包含第一个具有 moreInfo.inStock === false 的项目

【问题讨论】:

  • 如果您知道需要更新的条目的id,则应查找该id,然后仅更新该条目,而不是重写整个数组
  • id 是连续的吗?它们是从 1 开始到 34000,还是更随机?
  • 我想我过于复杂了,我可以在 for 循环中使用 for 循环并更改该条目,而不是重写,谢谢@HunterMcMillen。
  • 所以,这是你的情况:首先,你有originalData。您通过投票获得updatedData。现在,您想根据来自updatedData 的新数据更新originalData 中的数据。对吗?

标签: javascript arrays performance


【解决方案1】:

看完你的情况,我的建议如下:

  1. 对大型数组进行排序。您只需执行 一次,因此不必担心。在已排序的数组中查找值总是比在未排序的数组中更快、更容易。
  2. 遍历您的updatedData,取出一个项目,在您的排序数组 (originalData) 中查找它,使用二分搜索。根据需要进行更新。

要了解如何在 javascript 中实现二分搜索,可以参考此post,或此one。

【讨论】:

    【解决方案2】:

    我肯定把这件事弄得太复杂了。这是我想出的解决方案,但如果有人知道更快的解决方案,我将不胜感激。

    function updateArray(latest, current) {
      for (let i = 0, len = current.length; i < len; i++) {    
        for (let g = 0, len = latest.length; g < len; g++) {
          if (latest[g].module.id === current[i].module.id) {
            current[i] = latest[g];
            break;
          }
        }
      }
    
      return current;
    }
    

    【讨论】:

    • 如果latest 和current 的长度相似,这仍然可能很慢O(n^2)(假设n 接近m。如果你保持current 数组按@ 排序987654326@ 你可以使用二分搜索来查找需要在O(log n) 时间更新的元素,而不是O(n)
    • 既然 info.id 是唯一的,为什么不使用散列代替。然后你需要做的就是遍历最新的数组并简单地覆盖当前哈希中的匹配条目。
    • latest 会非常小,比如 1-3 个项目的数组
    猜你喜欢
    • 2016-04-26
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多