我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript中如何对大量数据的多重过滤

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript中如何对大量数据的多重过滤

本篇文章为大家展示了JavaScript中如何对大量数据的多重过滤,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

所有代码使用 ES2015 语法,需要 ES5 语法的可以用 Babel - Try it out 或者 TypeScript Playground  翻译。

问题提出

今天有朋友问我一个问题,前端通过 Ajax 从后端取得了大量的数据,需要根据一些条件过滤,过滤的方法是这样的:

class Filter {     filterA(s) {         let data = this.filterData || this.data;         this.filterData = data.filter(m => m.a === s);     }          filterB(s) {         let data = this.filterData || this.data;         this.filterData = data.filter(m => m.b === s);     } }

现在迷糊了,觉得这样处理数据不对,但是又不知道该怎么处理。

发现问题

问题就在过滤上,这样固然可以实现多重过滤(先调用 filterA() 再调用 filterB()  就可以实现),但是这个过滤是不可逆的。假如过滤过程是这样:

f.filterA("a1"); f.filterB("b1"); f.filterA("a2");

本来是希望按 "a1" 和 "b1" 过滤了数据之后,再修改***个条件为 "a2",但结果却成了空集。

解决问题

发现了问题,就针对性的解决。这个问题既然是因为过滤过程不可逆造成的,那每次都直接从 this.data 开始过滤,而不是从this.filterData  开始过滤,就能解决问题。如果要这样做,就需要将选择的过滤条件先记录下来。

记录过滤条件

用一个列表记录过滤条件当然是可行的,但是注意对同一个条件的两次过滤是互斥的,只能保留***一个,所以应该用 HashMap 更为合适。

class Filter {     constructor() {         this.filters = {};     }      set(key, filter) {         this.filters[key] = filter;     }      getFilters() {         return Object.keys(this.filters).map(key => this.filters[key]);     } }

这种情况下,像上面的过程表示为

f.set("A", m => m.a === "a1"); f.set("B", m => m.b === "b1"); f.set("A", m => m.a === "a1"); let filters = f.getFilters(); // length === 2;

上面第 3 句设置的 filter 覆盖了第 1 句设置的那个。现在再用***取得的 filters 依次来过滤原数据  this.data,就能得到正确的结果。

有人会觉得 getFilters() 返回的列表不是按 set 的顺序的——的确,这是 HashMap  的特点,无序。不过对于简单条件的判断,不管谁先谁后,结果是一样的。但是对于一些复合条件判断,就可能会有影响。

确实需要的话,可以通过 array 代替 map 来解决一下顺序的问题,但这样查找效率会降低(线性查找)。如果还想解决查找效率的问题,可以用 array  + map 来处理。这里就不多说了。

过滤

实际上在使用的时候,每次都 getFilter() 再用一个循环来处理确实比较慢。既然 data 都封装成 Filter  中,可以考虑直接给一个filter() 方法来送货过滤接口。

class Filter {     filter() {         let data = this.data;         for (let f of this.getFilters()) {             data = data.filter(f);         }         return data;     } }

不过这样我觉得效率不太好,尤其是对大量数据的时候。不妨利用一下 lodash 的延迟处理过程。

利用 lodash 的延迟处理

filter() {     let chain = _(this.data);     for (let f of this.getFilters()) {         chain = chain.filter(f);     }     return chain.value(); }

lodash 在数据大于 200 的时候会启用延迟处理过程,也就是说,它会处理成一个循环中依次调用每一个 filter,而不是对每一个 filter  进行一次循环。

延迟处理和非延迟处理通过下图可以看出来区别。非延迟处理总共会进行 n(这里 n = 3) 次大循环,产生 n - 1  个中间结果。而延迟处理只会进行一次大循环,没有中间结果产生。

JavaScript中如何对大量数据的多重过滤

不过说实在的,我不太喜欢为了一点小事多加载一个库,所以干脆自己做个简单的实现

自己实现延迟处理

filter() {     const filters = this.getFilters();     return data.filter(m => {         for (let f of filters) {             // 如果某个 filter 已经把它过滤掉了,也不用再用后面的 filter 来判断了             if (!f(m)) {                 return false;             }         }         return true;     }); }

里面的 for 循环还可以用 Array.prototype.every 来简化:

filter() {     const filters = this.getFilters();     return data.filter(m => {         return filters.every(f => f(m));     }); }

数据过滤其实并不是多复杂的事情,只要把思路理清楚,搞明白什么数据是需要保留的,什么数据是临时(中间过程)的,什么数据是最终结果。利用  Array.prototype 中的相关方法,或者诸如 lodash 之类的工具,很容易就处理出来了。

上述内容就是JavaScript中如何对大量数据的多重过滤,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript中如何对大量数据的多重过滤

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在Oracle中通过变量实现数据过滤

在Oracle中,可以通过使用变量来实现数据过滤。以下是一个简单的示例:首先,定义一个变量并赋值:DEFINE department_id = 10;然后,在查询中使用变量来过滤数据:SELECT * FROM employeesWHER
如何在Oracle中通过变量实现数据过滤
2024-08-23

perl如何过滤文件中的数据

在Perl中,可以使用正则表达式或者内置的字符串函数来过滤文件中的数据。以下是两种常见的方法:1. 使用正则表达式过滤数据:```perlopen(my $fh, 'while (my $line = ) {if ($line =~ /pa
2023-10-07

python中数据量过大如何处理

在Python中处理大数据量的方法包括:1. 逐行处理:读取大型文件时,可以逐行读取并处理每一行数据,而不是一次性将整个文件加载到内存中。这样可以减少内存的使用,并降低程序的运行时间。2. 使用生成器:使用生成器可以按需生成数据,而不是一次
2023-09-14

Python如何对MySQL中的大量数据进行批量处理?(在Python中怎样实现对MySQL大数据的批量操作?)

本教程详细介绍了Python中对MySQL大量数据的批量处理方法,包括批量插入、更新和删除。它涵盖了使用executemany()函数、VALUES语法、WHERE子句和性能优化技巧。代码示例提供了如何完成这些操作的实际指导。通过使用这些技术,开发人员可以提高批量数据处理的效率,从而节省时间并优化数据库性能。
Python如何对MySQL中的大量数据进行批量处理?(在Python中怎样实现对MySQL大数据的批量操作?)
2024-04-02

Java中如何高效遍历大数据量集合?(在Java中,如何实现对大数据量集合的高效遍历?)

Java中遍历大数据量集合的优化方法:选择合适的数据结构(线性/非线性)并行遍历(多线程)惰性遍历(按需处理)提前分配内存使用原生循环深度/广度优先遍历(针对树/图)最佳实践:避免迭代器缓存集合预先计算值优化内存管理剖析性能瓶颈
Java中如何高效遍历大数据量集合?(在Java中,如何实现对大数据量集合的高效遍历?)
2024-04-02

如何对数据库中的表重命名

要对数据库中的表进行重命名,可以使用 ALTER TABLE 语句。以下是重命名表的基本语法:ALTER TABLE 表名 RENAME TO 新表名;例如,如果要将表名从 “customers” 改为 “clients”,可以执行以下命
如何对数据库中的表重命名
2024-02-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录