传统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<count; i++){o.arr1.push({id: start+i,count: 0})for(var j = 0; j < n; j++){o.arr2.push({id: start + i,num: Math.round(Math.random()*1000)})}}// 简单的打乱数组o.arr2.sort(function (a, b) {return a.num - b.num})return o
}// 传统方法的嵌套循环
function setArrCount2(o) {var l1 = o.arr1.lengthvar l2 = o.arr2.lengthvar arr1 = o.arr1var arr2 = o.arr2for(var i = 0; i < l1; i++) {for(var j = 0; j < l2; j++) {if(arr1[i].id === arr2[j].id){arr1[i].count += arr2[j].num}}}console.log(arr1)return arr1
}// 使用降幂算法
// arr2进行分组,建立以id值为key的对象
function getArrGroup(arr, id) {var o = {}var len = arr.lengthvar indexfor(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, fn) {var len = arr.lengthfor(var i = 0; i < len; i++) {arr[i] = fn(arr, o, i)}console.log(arr)return arr
}// 统计num的值
function getCount(arr) {var count = 0var len = arr.lengthfor(var i = 0; i < len; i++){count += arr[i].num}return count
}function someLogic(arr, o, i){arr[i].count = getCount(o[arr[i].id]) return arr[i]
}// 拿到2个数组
var myList = getArr(10000,5)
var myList1 = getArr(10000,5)// 传统方法
var st = new Date().getTime()
setArrCount2(myList1)
console.log(new Date().getTime() - st)//
var startTime = new Date().getTime()var obj = getArrGroup(myList.arr2, 'id')
setArrCount(myList.arr1, obj, someLogic)
console.log(new Date().getTime() - startTime)

核心代码:

// 使用降幂算法
// arr2进行分组,建立以id值为key的对象
function getArrGroup(arr, id) {var o = {}var len = arr.lengthvar indexfor(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.lengthfor(var i = 0; i < len; i++) {arr[i] = fn(arr, o, i)// fn定义处理逻辑}console.log(arr)return arr
}

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

  1. 车险往年保单关联计算的性能优化

    [摘要] 保险行业计算车险往年保单,需要按照车辆 vin 码.车架号.牌照种类和牌照号等多字段关联,涉及到几千万甚至上亿的大表,用存储过程计算非常耗时.点击车险往年保单关联计算的性能优化,去乾学院看看 ...

  2. 车险往年保单关联计算的性能优化 1

    [摘要] 保险行业计算车险往年保单,需要按照车辆 vin 码.车架号.牌照种类和牌照号等多字段关联,涉及到几千万甚至上亿的大表,用存储过程计算非常耗时.点击:车险往年保单关联计算的性能优化,去乾学院看 ...

  3. Node.js 根本没有这样搞性能优化的?

    1.使用最新版本的 Node.js 仅仅是简单的升级 Node.js 版本就可以轻松地获得性能提升,因为几乎任何新版本的 Node.js 都会比老版本性能更好,为什么? Node.js 每个版本的性能 ...

  4. php大数组循环嵌套的性能优化

    一.前言 博主最近在用elasticsearch做项目,查出来的数据都是数组,在筛选数据组装数据的时候,难免会碰到循环嵌套的问题.如果两个50000的数组循环嵌套,那实际运算则是50000*50000 ...

  5. 2021-05-08 js数组 截取 查找 拼接 二维数组

    slice 数组的截取方法 数组.slice(start,end)   从开始位置截取到末尾 返回值:被截取的内容 注意 数组.slice(start) 从开始位置一直截取到最后 数组.slice() ...

  6. 按需加载图片、html代码、js代码,前端页面性能优化

    加载一个比较长的页面,或者图片比较多的页面,如果把资源一次性全部加载,在网络不是很好的情况下可能造成页面留白现象,用户体验极差! 因此呢,我们可以把用户暂时不会看到或用到的资源先不加载,在某个条件下, ...

  7. 你不知道的Node.js性能优化,读了之后水平直线上升

    本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 D ...

  8. Node.js性能优化

    你不知道的Node.js性能优化 - 知乎 https://zhuanlan.zhihu.com/p/50055740 你不知道的Node.js性能优化 "当我第一次知道要写这篇文章的时候, ...

  9. js array 删除指定元素_数组--学习笔记(数据结构数组 /js数组)

    学习目标: 了解什么是数组: 数组如何访问内存地址(一维,二维): 什么是数组 是由相同类型的元素的集合所组成的数据结构,分配一块连续的内存来存储.利用元素的索引可以计算出该元素对应的存储地址. 最简 ...

最新文章

  1. Yann LeCun推荐!自监督学习、全景FPN...内容平台的四大技术指南
  2. USTC服务器使用笔记
  3. 文科生能学懂python吗_文科生也能学得懂的Python入门视频
  4. mysql不能写重复键_mysql主键重复,不抱错,只更新的骚操作 (如果没有插入,如果有更新)...
  5. 不同林间域账号密码迁移
  6. html代码id,浅谈html中id和name的区别实例代码
  7. 微信小程序-组件使用
  8. NPAPI:JS的Number,在接口中可能是int32,也可能是double
  9. JavaSE基本语法练习题(下)
  10. 华为认证、华三认证、思科认证考哪个好?
  11. 流体力学matlab例题,流体力学简单计算MATLAB程式
  12. 电动机效率 matlab,【原创】matplotlib绘制电机效率MAP图
  13. CVPR2021 | 记录SCRFD人脸检测C++工程化(含docker镜像)
  14. 部署Kubernetes集群+Dashboard可视化页面-1.18.6版本
  15. cshop模板smarty foreach详解
  16. 【IDEA】idea插件的安装和删除
  17. Element UI table 修改定位
  18. 统一vscode和hbuildX开发工具格式化规则
  19. centos系统下安装mysql
  20. 利用python计算圆球的体积_Python 实例:概率计算

热门文章

  1. Java查询对象中匹配元素_用LinkedList如何实现搜索指定对象的元素
  2. gradle配置到阿里云_通过图文步骤的方式,带你配置阿里云服务器搭建网站
  3. Windows 增加 Open command window here 选项
  4. 南开计算机与控制工程学,2017南开大学计算机与控制工程学院考研复试名单
  5. JAVA 序列化 Jackson_SpringBoot系列——Jackson序列化
  6. java调用数据库存储过程_Java调用SQL Server的存储过程详解
  7. 微信小程序php java_PHP实现微信小程序用户授权的工具类示例
  8. 20210119:力扣第42周双周赛(下)
  9. 此计算机缺少或多个网络协议,Win10无法上网提示此计算机缺少一个或多个网络协议的四种解决方法...
  10. fastreport打印指定路径图片显示不出来_报表工具中图片文件怎么展示---本地图片--网络图片--数据库图片...