前文构造的筛选器对象能够实现简单的字段筛选,但是,实际应用中,我们常常会遇到对数组进行操作的需求,如果仅仅是对单纯的数组进行检索、定界、排序尚不复杂,而当数组数据混杂在更复杂的对象中或者数组中包含复杂对象时,这些需求就会变得比较棘手了。
数组筛选器就是应对这些问题而设计的,我们继续从一个简单的例子开始:
如下是一个很平常的数组对象:
[ { 'field1': 1, 'field2': 1, 'field3': 1, 'field4': 4 }, { 'field1': 1, 'field2': 2, 'field3': 4, 'field4': 1 }, { 'field1': 1, 'field2': 2, 'field3': 1, 'field4': 2 }, { 'field1': 2, 'field2': 1, 'field3': 2, 'field4': 3 }, { 'field1': 1, 'field2': 2, 'field3': 2, 'field4': 5 } ]
现在针对这个数组,我们的需求如下:
- 将数组基于field3降序排序。
- 只保留field1字段值为1的前2项。
- 最终的筛选结果中只保留field1和field4两个字段。
针对以上需求,按照常规方式我们会分三步对数据进行处理,预估的代码量可能需要数十行,当需求发生改变时,往往会把这些代码搞得一团糟,OK,我们用筛选器的思路来做做看,下面构造如下的筛选器:
在如上的筛选器中,依然是从字段筛选开始(筛选器最外层数组中的每一项表示要保留的字段),当字段筛选的对象是数组时,筛选器会自动深入数组中对数组的每一项生效。[ 'field1', 'field4', [ { '$sort': [ '!field3' ] }, { '$filter': { 'field1': 1 } }, { '$limit': [ 0, 2 ] } ] ]
与前文不同的是,这个筛选器的第三项并不是描述字段名的字符串,而是又一个数组,这个数组就是所谓的数组筛选器。
数组筛选器目前可以包含三个可选的对象,分别是$sort,$filter和$limit。其中$sort对象实现对数组的排序,他的值是一个排序字段的列表数组,数组中的每一项表示一个排序字段,写在前面的字段名排序优先级更高,此外在字段名前加上!字符表示降序排列(默认为升序)。
$filter对象实现对数组字段值的筛选(类似于SQL中的WHERE),他的值是一个对象,对象中的每一项表示一个筛选条件,如筛选器即表示选择field1字段值为1的项。目前筛选器仅支持完全匹配,后续会加入正则表达式匹配以完善功能。
$limit对象实现对数组的水平裁剪,它的值是一个数组或一个数字,当值为数组时,数组的第一项表示裁剪的偏移量,第二项表示裁剪的长度。当值为数字时,表示仅取数组的第n项。
数组筛选器可以放置在字段筛选器的任意位置,实际上筛选器代码总是会优先处理完数组筛选器后才会执行字段筛选操作(垂直裁剪)。
以上筛选器最终会产生如下结果,与我们需求预想的结果一致:
[ { 'field1': 1, 'field4': 1 }, { 'field1': 1, 'field4': 5 } ]
以上三个 数组筛选器配合上前文介绍的 字段筛选器和 子字段筛选器,实际上不经意间我们实现了一个简单的内存数据库(目前仅支持查找,不支持更新)。
一个JavaScript数据筛选器(二)——数组筛选器
最新推荐文章于 2024-07-04 09:58:07 发布