有时候也会需要在前端进行数据筛选,增强交互体验。当数据可用的筛选条件较多时,把逻辑写死会给后期维护带来很*烦。下面是我自己写的一个简单的筛选器,筛选条件可以根据数据包含的字段动态设置。本文主要为大家详细介绍了基于JavaScript实现前端数据多条件筛选功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。

仿照京东的筛选条件,这里就取价格区间和品牌作为测试。

代码

代码中主要使用js的过滤器Array.prototype.filter,该方法会对数组元素进行遍历检查,返回一个符合检查条件的新数组,不会改变原数组。

// filter()

var foo = [0,1,2,3,4,5,6,7,8,9];

var foo1 = foo.filter(

function(item) {

return item >= 5

}

);

console.log(foo1); // [5, 6, 7, 8, 9]

有了这个方法,筛选数据方便了很多,下面先定义一个商品类。

// 定义商品类

function Product(name, brand, price) {

this.name = name; // 名称

this.brand = brand; // 品牌

this.price = price; // 价格

}

创建一个过滤器对象,把所有过滤数据的方法放在里面。为了能自动适配不同的筛选条件,将筛选条件分为两个大类,一个是区间类型rangesFilter ,如:品牌、内存等;一个是选择类型choosesFilter,如:价格、屏幕尺寸等。

不同大类同时筛选时,进行的是与逻辑,每个大类在上一个大类筛选结果上进行筛选。比如我要筛选2000-5000块的华为手机,先调用rangesFilter筛选products并返回结果result1,然后用choosesFilter筛选result1并返回结果resulte2。

当然,如果还有其它大类,不一定是与逻辑,再另行处理。

// 商品筛选器

const ProductFilters = {

/**

* 区间类型筛选

* @param {array} products

* @param {array} ranges

*/

rangesFilter: function (products, ranges) { }

/**

* 选择类型筛选

* @param {array} products

* @param {array} chooses

*/

choosesFilter: function (products, chooses) { }

}

区间类型的筛选,代码如下。

// 区间类型条件结构

ranges: [

{

type: 'price', // 筛选类型/字段

low: 3000, // 最小值

high: 6000 // 最大值

}

]

/**

* @param {array} products

* @param {array} ranges

*/

rangesFilter: function (products, ranges) {

if (ranges.length === 0) {

return products;

} else {

/**

* 循环多个区间条件,

* 每种区间类型应该只有一个,

* 比如价格区间不会有1000-2000和4000-6000同时需要的情况

*/

for (let range of ranges) {

// 多个不同类型区间是与逻辑,可以直接赋值给自身

products = products.filter(function (item) {

return item[range.type] >= range.low && item[range.type] <= range.high;

});

}

return products;

}

}

选择类型筛选:

// 选择类型条件结构

chooses: [

{

type: 'brand',

value: '华为'

},

{

type: 'brand',

value: '苹果'

}

]

/**

* @param {array} products

* @param {array} chooses

*/

choosesFilter: function (products, chooses) {

let tmpProducts = [];

if (chooses.length === 0) {

tmpProducts = products;

} else {

/**

* 选择类型条件是或逻辑,使用数组连接concat

*/

for (let choice of chooses) {

tmpProducts = tmpProducts.concat(products.filter(function (item) {

return item[choice.type].indexOf(choice.value) !== -1;

}));

}

}

return tmpProducts;

}

定义一个执行函数doFilter()。

function doFilter(products, conditions) {

// 根据条件循环调用筛选器里的方法

for (key in conditions) {

// 判断是否有需要的过滤方法

if (ProductFilters.hasOwnProperty(key + 'Filter') && typeof ProductFilters[key + 'Filter'] === 'function') {

products = ProductFilters[key + 'Filter'](products, Conditions[key]);

}

}

return products;

}

// 将两种大类的筛选条件放在同一个对象里

let Conditions = {

ranges: [

{

type: 'price',

low: 3000,

high: 6000

}

],

chooses: [

{

type: 'brand',

value: '华为'

}

]

}

测试

创建10个商品数据,以及筛选条件

// 商品数组

const products = [

new Product('华为荣耀9', '华为', 2299),

new Product('华为P10', '华为', 3488),

new Product('小米MIX2', '小米', 3599),

new Product('小米6', '小米', 2499),

new Product('小米Note3', '小米', 2499),

new Product('iPhone7 32G', '苹果', 4588),

new Product('iPhone7 Plus 128G', '苹果', 6388),

new Product('iPhone8', '苹果', 5888),

new Product('三星Galaxy S8', '三星', 5688),

new Product('三星Galaxy S7 edge', '三星', 3399),

];

// 筛选条件

let Conditions = {

ranges: [

{

type: 'price',

low: 3000,

high: 6000

}

],

chooses: [

{

type: 'brand',

value: '华为'

},

{

type: 'brand',

value: '苹果'

}

]

}

调用函数

let result = doFilter(products, Conditions);

console.log(result);

输出

代码的扩展性和可维护性都很好,只要保证筛选条件中的type字段在商品数据中一致都可以筛选,比如将筛选条件改为

let Conditions = {

ranges: [

{

type: 'price',

low: 3000,

high: 6000

}

],

chooses: [

{

type: 'name',

value: 'iPhone'

}

]

}

输出

搜索匹配等一些地方也需要优化,是否区分大小写、是完全匹配还是模糊匹配等。

相关推荐:

php多条件筛选前台功能,JavaScript前端数据多条件筛选功能实现代码相关推荐

  1. JS前端数据多条件筛选

    有时候也会需要在前端进行数据筛选,增强交互体验.当数据可用的筛选条件较多时,把逻辑写死会给后期维护带来很大麻烦.下面是我自己写的一个简单的筛选器,筛选条件可以根据数据包含的字段动态设置.仿照京东的筛选 ...

  2. 前端战五渣学JavaScript——前端数据存储

    说起前端数据存储,那就不得不提到Cookie.sessionStorage和localStorage,这是我们接触到的最熟悉的前端数据存储的单词,作为一个前端开发.前端工程师,这三个单词用没用过先不管 ...

  3. html预览图片的功能,javascript实现的图片预览功能

    本文实例讲述了javascript实现的图片预览功能.分享给大家供大家参考,具体如下: 1.将下面的代码复制到 内 /* Thumbnail image viewer- ?Dynamic Drive ...

  4. 基于JavaScript实现前端数据多条件筛选功能

    效果图: 实现方法:默认全部.点击每一项进行不同条件切换,根据后台数据传递参数,实现动态的商品筛选功能. 参考如下: 代码如下:源代码 下载: https://github.com/gaomengpi ...

  5. JavaScript前端手机、身份证、银行卡验证代码

    jQuery.validator.addMethod("idCardValid", function(value, element) {return this.optional(e ...

  6. javascript回车完美实现tab切换功能

    javascript回车完美实现tab切换功能 javascript通过回车实现tab切换功能,最经有一个项目是给化工厂做的在使用的过程中需要输入大量的数据,使用的都是小键盘区,在以前都是通过exce ...

  7. R筛选dataframe时间范围内的数据

    R筛选dataframe时间范围内的数据 目录 R筛选dataframe时间范围内的数据 两个日期之间的数据 某一日期之后的子集

  8. excel解决日期数据无法正常筛选

    为什么日期数据无法正常筛选 提问:为什么日期数据无法正常筛选? 说明:筛选日期数据时,找不到按日期筛选的选项,比如按月.按周筛选等. 无法正常筛选的日期数据,如下图所示. 目标效果为: 解决 解决方案 ...

  9. vue 点击按钮筛选功能_vue实现前端列表多条件筛选

    本文实例为大家分享了vue实现前端列表多条件筛选的具体代码,供大家参考,具体内容如下 1.先上图: 2.搜索条件绑定的数据是: filterForm:{ schoolName:'',//输入的学校名称 ...

最新文章

  1. 我眼中的Linux设备树(六 memorychosen节点)
  2. loadruner11 socket脚本-10053错误
  3. jqprint控件使用
  4. aws linux使用ssh登陆_【Linux】 使用ssh连接远程服务器
  5. [HDU] 3491 Thieves
  6. 二进制转十进制 十进制转二进制
  7. mysql8 bigint类型和datetime类型的转换
  8. 在java创建线程结果_Java创建线程的三种方式
  9. sas+eg连接mysql_SAS EG 连接 SQL Server 2017数据库
  10. 《普林斯顿微积分读本》学习笔记
  11. 阿昌教你Linux密码忘记后如何重置
  12. Hive报错记录——林子雨教材
  13. 雷达多普勒频率计算公式_智能驾驶之眼-毫米波雷达技术详解
  14. 猫、路由器和交换机的区别和联系
  15. winscp使用教程 linux,WinSCP使用方法教程
  16. 增量学习方法分类及近两年论文汇总
  17. c语言期末复习专项——编程题
  18. ADO.NET Entity Framework 入门示例
  19. js 带笔锋 签字版_袁大头签字版市值几十万
  20. C语言之自动贩卖机+超级计算器+成绩计算+景区票价+身体指数测量!

热门文章

  1. 数码相框_在LCD上显示英文字母、汉字的点阵显示(2)
  2. python3实现softmax + 函数曲线绘制
  3. api数据接口文档_接口文档示例(Taobao/jd/pinduoduo/开放接口调用)
  4. “此工作站和主域间的信任关系失败”之解决
  5. 通过经纬度计算两点间的直线距离
  6. python cookbook 读书笔记2(字符串处理2)
  7. java迭代器遍历json,批量替换内容
  8. BUPT计导第三次机考12.8数组+二分答案详解
  9. [题单]多校补题 2017-2012
  10. 数字IC秋招手撕代码(二)50%占空比的三分频