js查重去重性能优化心得
概述
今天产品反映有个5000条数据的页面的保存按钮很慢,查看代码看到是因为点击保存按钮之后,进行了查重操作,而查重操作是用2个for循环完成了,时间复杂度是O(n^2)。没办法,只能想办法优化一下了。
主要参考了这篇文章:JavaScript 高性能数组去重
源码
简单来说,这个页面的要求是查找一个数组中的重复项,并且返回重复项的行号。源码简化后如下:
checkData(tableData) {
// console.time('数组检查重复项时间');
// 检查重复项,检查空值(全局)
const repeatMidArr = [];
const repeatArr = [];
for (let i = 0; i < tableData.length; i += 1) {
// 检查重复项
for (let j = i + 1; j < tableData.length; j += 1) {
const arr1 = tableData[i].condition;
const arr2 = tableData[j].condition;
if (arr1.length === arr2.length && JSON.stringify(arr1) === JSON.stringify(arr2)) {
repeatMidArr.push(i + 1);
repeatMidArr.push(j + 1);
}
}
}
// 给repeatMidArr去重
repeatMidArr = repeatMidArr.sort();
if (repeatMidArr.length <= 1) {
repeatArr = repeatMidArr;
} else {
repeatArr.push(repeatMidArr[0]);
for (let i = 1; i < repeatMidArr.length; i += 1) {
if (repeatMidArr[i] !== repeatMidArr[i - 1]) repeatArr.push(repeatMidArr[i]);
}
}
// console.timeEnd('数组检查重复项时间');
if (repeatArr.length !== 0) {
this.sendRepeatMsg(repeatArr);
return true;
}
return false;
},
注意:
- 因为需要对一个数组查重,所以使用了JSON.stringify把数组转化为字符串简单处理。
- 给纯数字数组利用sort方法去重。
优化
优化的核心思想是算法中的hash表,也就是字典。在js中可以利用对象的键值不重复这个特性来把对象变成一个hash表。简化后的代码如下:
checkData(tableData) {
// console.time('数组检查重复项时间');
// 检查重复项,检查空值(全局)
const repeatObj = {};
let repeatMidArr = [];
let repeatArr = [];
for (let i = 0; i < tableData.length; i += 1) {
// 检查重复项(优化方法)
const itemCondition = JSON.stringify(tableData[i].condition);
const index = repeatObj[itemCondition];
if (!index) {
repeatObj[itemCondition] = i + 1;
} else {
repeatMidArr.push(index);
repeatMidArr.push(i + 1);
}
}
// 给repeatMidArr去重
repeatMidArr = repeatMidArr.sort();
if (repeatMidArr.length <= 1) {
repeatArr = repeatMidArr;
} else {
repeatArr.push(repeatMidArr[0]);
for (let i = 1; i < repeatMidArr.length; i += 1) {
if (repeatMidArr[i] !== repeatMidArr[i - 1]) repeatArr.push(repeatMidArr[i]);
}
}
// console.timeEnd('数组检查重复项时间');
if (repeatArr.length !== 0) {
this.sendRepeatMsg(repeatArr);
return true;
}
return false;
},
代码很简单,这里就不细说了。这种方法既然都能用到查重并返回重复项中,当然也能够用到去重里面去。
结果
优化之后,在5000条数据下,点击保存按钮的响应时间从35秒缩短到了3秒,性能提升了10倍!!!
js查重去重性能优化心得的更多相关文章
- angular性能优化心得
原文出处 脏数据检查 != 轮询检查更新 谈起angular的脏检查机制(dirty-checking), 常见的误解就是认为: ng是定时轮询去检查model是否变更.其实,ng只有在指定事件触发后 ...
- AngularJS性能优化心得,自己踩过的抗,及一些别人的经验(转哦)
脏数据检查 != 轮询检查更新 谈起angular的脏检查机制(dirty-checking), 常见的误解就是认为: ng是定时轮询去检查model是否变更.其实,ng只有在指定事件触发后,才进入$ ...
- JS日期格式化函数性能优化篇
最近开发的软件中需要用到日志功能,其中有一个重要功能是显示日期和时间.于是网上搜了一把,搜到大量的日期格式化函数,不过比较了下,感觉代码都不够优雅,而且性能都不给力.对线上一些代码进行了评测,以下是一 ...
- js怎么动态加载js文件(JavaScript性能优化篇)
下面介绍一种JS代码优化的一个小技巧,通过动态加载引入js外部文件来提高网页加载速度 [基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完 ...
- [js高手之路]性能优化技巧 - 缓存与函数重载实战
所谓缓存,通俗点讲就是把已经做过的事情结果先暂时存起来,下次再做同样的事情,不用再重新去做,只要把之前的存的结果拿出来用即可,很明显大大提升了效率.他的应用场景非常广泛.如: 1.缓存ajax结果,大 ...
- springboot mybatis下临时表的创建和删除,可用于查重去重
/** * 创建临时表 */ @Update({"drop temporary table if exists ${tableName};", "create tempo ...
- C#中那些[举手之劳]的性能优化
隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...
- C#程序员应该养成的程序性能优化写法
转载一个别人的文章 隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒…… 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对 ...
- babel-polyfill使用与性能优化
文章首发于笔者的个人博客 文章概览 本文主要内容包括:什么是babel-polyfill,如何使用,如何通过按需加载进行性能优化. 本文所有例子可以在 笔者的github 找到. 什么是babel-p ...
随机推荐
- layer.open()利用代码实现伪阻塞
今天在项目中遇到需要弹框处理的问题,,当用户点击某个单选框时,需要进行确认操作,,常规的情况下,因为layer.open()和layer.confirm()都是异步执行的, 在点击单选框之后单选框会立 ...
- Hive学习笔记 --Permission denied: user=anonymous, access=READ
执行select语句报错 Error: java.io.IOException: org.apache.hadoop.security.AccessControlException: Permissi ...
- Java 自定义注释@interface的用法
最简单的待校验的注解定义 @Documented @Constraint(validatedBy = ExistBlankByListValidator.class) @Target({PARAMET ...
- with原理__enter__、__exit__
Python对with的处理还很聪明.基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法. 紧跟with后面的语句被求值后,返回对象的__enter__( ...
- C语言第零次作业
Q1.你对网络专业或者计算机专业了解是怎样? 说实话不了解网络专业,在甚至在填志愿之前我都不曾听说过.但经过一番的查阅资料.现在,首先我了解到我们主要学习计算机.通信以及网络方面的基础理论.设计原理, ...
- Python获取当前日期和日期差计算
在Python中获取日期和时间很简单,主要使用time和datetime包 1.获取当前时间并格式化 from dateutil import rrule from datetime import d ...
- 通过源码理解HashMap的并发问题
最近在学习有关于Java的基础知识,在学习到HashMap的相关知识的时候,了解了HashMap的并发中会出现的问题,在此记录,加深理解(这篇文章是基于Java1.7的,主要是为了更加直观,更新版本的 ...
- UI框架
一,框架构成:目录分别有bin,lib,page,report,test_case,(百度网盘) 1.bin>run.py 2.lib>HTMLTestRunner.py lib>l ...
- 190327 Python登录接口
#!Author:John # _*_ coding: utf-8 _*_ #编写登录接口 #输入用户名密码 #认证成功后显示欢迎信息 #输错三次后锁定 import sys, os, getpass ...
- 关于在centos7 64为引用android so引发的问题修复
背景: 公司有解码的app,解码库位c++编写so动态库. 之前做过一版在调用html5摄像头,然后提取图像进行解码,后面因为图像质量不佳放弃. 最近 因为小程序api有更新 可以获取到相对清晰的图像 ...