全网整合营销服务商

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

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


相关文章: 焦点电影公司作品,电影焦点结局是什么?  建站之星上传入口如何快速找到?  郑州企业网站制作公司,郑州招聘网站有哪些?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  建站之星伪静态规则如何设置?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  建站之星会员如何解锁更多建站功能?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何快速搭建高效香港服务器网站?  盘锦网站制作公司,盘锦大洼有多少5G网站?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  建站之星后台管理系统如何操作?  如何选择网络建站服务器?高效建站必看指南  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何快速上传建站程序避免常见错误?  小型网站制作HTML,*游戏网站怎么搭建?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  建站上传速度慢?如何优化加速网站加载效率?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  ,想在网上投简历,哪几个网站比较好?  微信小程序 五星评分(包括半颗星评分)实例代码  存储型VPS适合搭建中小型网站吗?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  浅析上传头像示例及其注意事项  网站制作网站,深圳做网站哪家比较好?  独立制作一个网站多少钱,建立网站需要花多少钱?  ,网页ppt怎么弄成自己的ppt?  建站主机核心功能解析:服务器选择与网站搭建流程指南  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何通过多用户协作模板快速搭建高效企业网站?  *服务器网站为何频现安全漏洞?  网站企业制作流程,用什么语言做企业网站比较好?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Swift中swift中的switch 语句  建站之星如何开启自定义404页面避免用户流失?  图册素材网站设计制作软件,图册的导出方式有几种?  Swift中循环语句中的转移语句 break 和 continue  济南专业网站制作公司,济南信息工程学校怎么样?  企业微网站怎么做,公司网站和公众号有什么区别?  ,制作一个手机app网站要多少钱?  b2c电商网站制作流程,b2c水平综合的电商平台?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  如何获取PHP WAP自助建站系统源码?  开源网站制作软件,开源网站什么意思?  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何用好域名打造高点击率的自主建站? 

您的项目需求

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