资讯专栏INFORMATION COLUMN

JS数组关联查找的性能优化

Stardustsky / 1381人阅读

摘要:传统个数组的嵌套查询一般通过两个循环体嵌套实现,时间复杂度为而通过建立索引对象的形式的时间复杂度为这种牺牲内存来达到复杂度降幂的的方法能提高多少性能呢下面是以数组长度为数组为的乱序数组进行测试的测试结果。

传统2个数组的嵌套查询一般通过两个循环体嵌套实现,时间复杂度为:n^2;
而通过建立索引对象的形式的时间复杂度为:n;这种牺牲内存来达到复杂度降幂的的方法能提高多少性能呢?

下面是以数组1长度为10000;数组2为50000的乱序数组进行测试的测试结果。(测试结果的单位都是ms)

Firefox测试结果: 平均快48倍

// 第一次
传统的嵌套循环:1479
建立索引:30
// 第二次
传统的嵌套循环:1852
建立索引:36
// 第三次
传统的嵌套循环:1754
建立索引:38

Chrome测试结果: 平均快64倍

// 第一次
传统的嵌套循环:1800
建立索引:26
// 第二次
传统的嵌套循环:1297
建立索引:35
// 第三次
传统的嵌套循环:2522
建立索引:27

IE11测试结果:平均快11倍

// 第一次
传统的嵌套循环:110431
建立索引:616
// 第二次
传统的嵌套循环:7172
建立索引:689
// 第三次
传统的嵌套循环:7310
建立索引:686

完整的代码(实际使用中请考虑数据类型校验和是否为空判断)

// 情景:从数组arr1的id拿到数组arr2中的所有记录,统计急了num的总和写回到arr1中

// 模拟2个数组
var start = 1000000
// 定义模拟2个数组的方法;count: arr1的长度值;n: 为arr2为arr1的长度的多少倍
function getArr(count, n) {
  var o = {
    arr1: [],
    arr2: []
  }
  for(var i = 0; i

核心代码:

// 使用降幂算法
// arr2进行分组,建立以id值为key的对象
function getArrGroup(arr, id) {
  var o = {}
  var len = arr.length
  var index
  for(var i = 0; i < len; i++){
    index = arr[i][id]
    // 建立索引,防止覆盖
    if(o[index]===undefined){
      o[index] = [arr[i]]
    } else {
      o[index].push(arr[i])
    }
  }
  return o
}
// 给arr1项的count赋值
function setArrCount(arr, o, id, fn) {
  var len = arr.length
  for(var i = 0; i < len; i++) {
    arr[i] = fn(arr, o, i)// fn定义处理逻辑
  }
  console.log(arr)
  return arr
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98085.html

相关文章

  • 精读《JS 引擎基础之 Shapes and Inline Caches》

    摘要:概述的解释器优化器代码可能在字节码或者优化后的机器码状态下执行,而生成字节码速度很快,而生成机器码就要慢一些了。比如有一个函数,从获取值引擎生成的字节码结构是这样的指令是获取参数指向的对象,并存储在,第二步则返回。 1 引言 本期精读的文章是:JS 引擎基础之 Shapes and Inline Caches 一起了解下 JS 引擎是如何运作的吧! JS 的运作机制可以分为 AST 分...

    Tecode 评论0 收藏0
  • JavaScript如何工作:V8引擎深入探究 + 优化代码5个技巧(译文)

    摘要:引擎可以是一个标准的解释器,也可以是一个将编译成某种形式的字节码的即时编译器。和其他引擎最主要的差别在于,不会生成任何字节码或是中间代码。不使用中间字节码的表示方式,就没有必要用解释器了。 原文地址:https://blog.sessionstack.com... showImg(https://segmentfault.com/img/bVVwZ8?w=395&h=395); 数周之...

    William_Sang 评论0 收藏0
  • 前端排序算法总结;前端面试题2.0;JavaScript异步编程

    摘要:与异步编程按照维基百科上的解释独立于主控制流之外发生的事件就叫做异步。因为的存在,至少在被标准化的那一刻起,就支持异步编程了。然而异步编程真正发展壮大,的流行功不可没。在握手过程中,端点交换认证和密钥以建立或恢复安全会话。 1、前端 排序算法总结 排序算法可能是你学编程第一个学习的算法,还记得冒泡吗? 当然,排序和查找两类算法是面试的热门选项。如果你是一个会写快排的程序猿,面试官在比较...

    aaron 评论0 收藏0
  • 前端排序算法总结;前端面试题2.0;JavaScript异步编程

    摘要:与异步编程按照维基百科上的解释独立于主控制流之外发生的事件就叫做异步。因为的存在,至少在被标准化的那一刻起,就支持异步编程了。然而异步编程真正发展壮大,的流行功不可没。在握手过程中,端点交换认证和密钥以建立或恢复安全会话。 1、前端 排序算法总结 排序算法可能是你学编程第一个学习的算法,还记得冒泡吗? 当然,排序和查找两类算法是面试的热门选项。如果你是一个会写快排的程序猿,面试官在比较...

    ARGUS 评论0 收藏0
  • 前端排序算法总结;前端面试题2.0;JavaScript异步编程

    摘要:与异步编程按照维基百科上的解释独立于主控制流之外发生的事件就叫做异步。因为的存在,至少在被标准化的那一刻起,就支持异步编程了。然而异步编程真正发展壮大,的流行功不可没。在握手过程中,端点交换认证和密钥以建立或恢复安全会话。 1、前端 排序算法总结 排序算法可能是你学编程第一个学习的算法,还记得冒泡吗? 当然,排序和查找两类算法是面试的热门选项。如果你是一个会写快排的程序猿,面试官在比较...

    April 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<