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

仿照京东的筛选条件,这里就取价格区间和品牌作为测试。
代码
代码中主要使用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<Product>} products
* @param {array<{type: String, low: number, high: number}>} ranges
*/
rangesFilter: function (products, ranges) { }
/**
* 选择类型筛选
* @param {array<Product>} products
* @param {array<{type: String, value: String}>} chooses
*/
choosesFilter: function (products, chooses) { }
}
区间类型的筛选,代码如下。
// 区间类型条件结构
ranges: [
{
type: 'price', // 筛选类型/字段
low: 3000, // 最小值
high: 6000 // 最大值
}
]
/**
* @param {array<Product>} products
* @param {array<{type: String, low: number, high: number}>} 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<Product>} products
* @param {array<{type: String, value: String}>} 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'
}
]
}
输出
搜索匹配等一些地方也需要优化,是否区分大小写、是完全匹配还是模糊匹配等。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# js前端数据多条件筛选
# js数据多条件筛选
# js数据筛选
# Javascript中关于Array.filter()的妙用详解
# JS中filter( )数组过滤器的使用
# JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用(JS数
# 华为
# 放在
# 多个
# 的是
# 我要
# 会有
# 也会
# 两种
# 遍历
# 会对
# 可以直接
# 只有一个
# 会给
# 可以根据
# 在上
# 创建一个
# 不同类型
# 大家多多
# 后期
# 便了
相关文章:
专业公司网站制作公司,用什么语言做企业网站比较好?
建站之星安装路径如何正确选择及配置?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
建站主机与虚拟主机有何区别?如何选择最优方案?
如何在建站主机中优化服务器配置?
如何在Windows环境下新建FTP站点并设置权限?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
制作网站怎么制作,*游戏网站怎么搭建?
c# await 一个已经完成的Task会发生什么
建站之星收费标准详解:套餐费用及年费价格表一览
制作网站的软件免费下载,免费制作app哪个平台好?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
建站之星代理费用多少?最新价格详情介绍
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
南宁网站建设制作定制,南宁网站建设可以定制吗?
建站之星×万网:智能建站系统+自助建站平台一键生成
Swift中循环语句中的转移语句 break 和 continue
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
建站之星图片链接生成指南:自助建站与智能设计教程
平台云上自助建站如何快速打造专业网站?
电商平台网站制作流程,电商网站如何制作?
建站之星如何通过成品分离优化网站效率?
,有什么在线背英语单词效率比较高的网站?
企业微网站怎么做,公司网站和公众号有什么区别?
代刷网站制作软件,别人代刷火车票靠谱吗?
,在苏州找工作,上哪个网站比较好?
建站之星后台密码遗忘如何找回?
如何快速搭建高效香港服务器网站?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
中山网站推广排名,中山信息港登录入口?
建站VPS选购需注意哪些关键参数?
如何使用Golang table-driven基准测试_多组数据测量函数效率
微信小程序 input输入框控件详解及实例(多种示例)
,石家庄四十八中学官网?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
建站之星如何防范黑客攻击与数据泄露?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何实现建站之星域名转发设置?
如何快速搭建高效WAP手机网站吸引移动用户?
电商网站制作公司有哪些,1688网是什么意思?
招商网站制作流程,网站招商广告语?
制作网站的基本流程,设计网站的软件是什么?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Swift中swift中的switch 语句
南京网站制作费用,南京远驱官方网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。