在javascript中快速使用新值更新现有数组

时间:2015-10-05 18:38:33

标签: javascript arrays performance

我从一个包含嵌套对象(~34,000个项目)的大型数组开始,每隔5秒进行一次轮询,接收对阵列的更新(一般每次更新2-3次)和新数组只包含已更改的项目(例如,如果只更改了3个项目,我只在我更新的数组中获得这3个项目。)

我尝试了以下使用下划线,但它需要长达9秒,我需要一秒或更少。

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

有人建议采取快速方法吗?如果它有帮助,唯一键将是info.id,并且我真正想要检测的唯一变化(我需要更新项目的原因)是inlines值是否改变。换句话说,如果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

的项目

2 个答案:

答案 0 :(得分:1)

在阅读完你的情况后,我的建议如下:

  1. 对大型数组进行排序。您只需要一次,所以不要担心。在排序数组中查找值总是比未排序的数组更快更容易。
  2. 循环浏览updatedData,获取项目,在已排序的数组中查找(originalData),使用二进制搜索。根据需要更新它。
  3. 要了解如何在javascript中实施二进制搜索,您可以参考此post或此one

答案 1 :(得分:0)

我肯定过于复杂了。这是我提出的解决方案,但如果有人知道更快的事情,我会很感激。

    private class MyBrowser extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return false;
        }

       @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            view.clearCache(true);
        }
    }