全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

基于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<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数  # 华为  # 放在  # 多个  # 的是  # 我要  # 会有  # 也会  # 两种  # 遍历  # 会对  # 可以直接  # 只有一个  # 会给  # 可以根据  # 在上  # 创建一个  # 不同类型  # 大家多多  # 后期  # 便了 


相关文章: 建站之星导航配置指南:自助建站与SEO优化全解析  如何通过西部建站助手安装IIS服务器?  如何在新浪SAE免费搭建个人博客?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何通过FTP服务器快速搭建网站?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  C++中引用和指针有什么区别?(代码说明)  威客平台建站流程解析:高效搭建教程与设计优化方案  学校免费自助建站系统:智能生成+拖拽设计+多端适配  Android自定义控件实现温度旋转按钮效果  如何选购建站域名与空间?自助平台全解析  建站10G流量真的够用吗?如何应对访问高峰?  PHP正则匹配日期和时间(时间戳转换)的实例代码  建站之星后台管理:高效配置与模板优化提升用户体验  深入理解Android中的xmlns:tools属性  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  代购小票制作网站有哪些,购物小票的简要说明?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  小程序网站制作需要准备什么资料,如何制作小程序?  如何通过万网虚拟主机快速搭建网站?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何快速查询域名建站关键信息?  ,在苏州找工作,上哪个网站比较好?  建站之星如何一键生成手机站?  音响网站制作视频教程,隆霸音响官方网站?  内部网站制作流程,如何建立公司内部网站?  Thinkphp 中 distinct 的用法解析  头像制作网站在线制作软件,dw网页背景图像怎么设置?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何在阿里云通过域名搭建网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何快速生成可下载的建站源码工具?  如何快速搭建高效服务器建站系统?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  网站制作公司排行榜,抖音怎样做个人官方网站  网站制作服务平台,有什么网站可以发布本地服务信息?  如何用AWS免费套餐快速搭建高效网站?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  如何在宝塔面板中创建新站点?  完全自定义免费建站平台:主题模板在线生成一站式服务  建站之星收费标准详解:套餐费用及年费价格表一览  如何在服务器上三步完成建站并提升流量?  如何通过免费商城建站系统源码自定义网站主题与功能?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  实例解析Array和String方法  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。