实例解析angularjs的filter过滤器

发布时间 - 2026-01-10 21:48:47    点击率:

现在公司用ionic,就是基于angularjs封装了一些api用于webapp,最近用的angularjs的filter确实省了很多代码,现在总结一下!

ng比较鸡肋的过滤器,这里就一笔带过吧!鸡汤类常用的filter后面上例子。

lowercase(小写)

{{ lastName | lowercase }}

uppercase(大写)

{{ lastName | uppercase }}

number(格式化数字)

number过滤器可以为一个数字加上千位分割,像这样,123,456,789。同时接收一个参数,可以指定小float型保留几位小数:

{{ num | number : 2 }}

currency (货币处理)

{{num | currency : '¥'}}

json(格式化json对象)

{{ jsonTest | json}}

作用就和我们熟悉的JSON.stringify()一样

 limitTo(限制数组长度或字符串长度)

{{ childrenArray | limitTo : 3 }}  //将会显示数组中的前3项

filter(匹配子串)

用来处理一个数组,然后可以过滤出含有某个子串的元素,作为一个子数组来返回。可以是字符串数组,也可以是对象数组。如果是对象数组,可以匹配属性的值。它接收一个参数,用来定义子串的匹配规则。

html

<ul>
 <li>filter 匹配子串(以下写法只是方便观察)</li>
 <li>{{ webArr | filter : 'n' }} <!--匹配属性值中含有n的--></li>
 <li>{{ webArr | filter : 25 }} <!--匹配属性值中含有25的--></li>
 <li>{{ webArr | filter : {name : 'l'} }} <!--//参数是对象,匹配name属性中含有l的--></li>
 <li>{{ webArr | filter : fun }} <!--/参数是函数,指定返回age>25的--></li>
</ul>

js

$scope.webArr = [
  {name:'nick',age:25},
  {name:'ljy',age:28},
  {name:'xzl',age:28},
  {name:'zyh',age:30}
 ];
$scope.fun = function(e){return e.age>25;};

效果展示:

filter 匹配子串(以下写法只是方便观察)

[{"name":"nick","age":25}]
[{"name":"nick","age":25}]
[{"name":"ljy","age":28},{"name":"xzl","age":28}]
[{"name":"ljy","age":28},{"name":"xzl","age":28},{"name":"zyh","age":30}]

日期类

日期过滤器应该是常用过滤器中最简单的吧!

  • yyyy--表示年份;
  • MM--月份(必须大写);
  • dd--日期;
  • hh--时;
  • mm--分(必须小写);
  • ss--秒;
  • EEEE--星期;
  • hh:mm--形式是24小时制;
  • h:mma--12小时制;
  • 其中年、月、日、时、分、秒 或  / : - 等自己试做搭配吧!
<ul>
 <li>8 日期1</li>
 <li ng-bind="date|date:'yyyy/MM/dd hh:mm:ss EEEE'"></li>
 <li>8 日期2</li>
 <li ng-bind="date|date:'yyyy年MM月dd日 h:mma EEEE'"></li>
 <li>8 日期3</li>
 <li ng-bind="date|date:'yyyy年MM月dd日 hh时mm分ss秒'"></li>
 <li>8 日期4</li>
 <li ng-bind="date|date:'yyyy/MM/dd hh:mm:ss'"></li>
 </ul>

日期1的显示效果:

2016/11/19 11:59:05 Saturday

日期2的显示效果:

2016年11月19日 12:01PM Saturday

日期3的显示效果:

2016年11月22日 10时42分09秒

日期4的显示效果:

2016/11/22 11:16:58

orderBy排序(个人认为第七例最佳写法)

ng-repeat生成一个独立的scope作用域,直接在ng-repeat循环后加管道orderBy排序。

用法很简单,但有坑需注意两点:

  • 参数引号勿忘;
  • 参数形式--直接写成age,不用写成item2.age。

3 按年龄排序(默认升序)

<ul>
 <li>3 按年龄排序(默认升序)</li>
 <li ng-repeat="item2 in items2|orderBy:'age'">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>

效果展示:

按年龄排序(默认升序)
name ljy
age 27
stature 165
name nick
age 25
stature 170
name xzl
age 27
stature 175
name zyh
age 29
stature 165

4 按年龄排序(加参数true则为倒序即降序)

<ul>
 <li ng-repeat="item2 in items2|orderBy:'age':true">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>

效果展示:

按年龄排序(加参数true则为倒序即降序)
name zyh
age 29
stature 165
name xzl
age 27
stature 175
name ljy
age 27
stature 165
name nick
age 25
stature 170

5 想先按年龄升序在按身高降序(全是降序了,达不到效果,见第7例)

我曾就天真的这样写过^*^

<ul>
 <!--<li ng-repeat="item2 in items2|orderBy:'age':'-stature'">-->
 <li ng-repeat="item2 in items2|orderBy:'age':'stature':true">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>

效果展示:

想先按年龄升序在按身高降序(全是降序了,达不到效果,见第7例)
name zyh
age 29
stature 165
name xzl
age 27
stature 175
name ljy
age 27
stature 165
name nick
age 25
stature 170

6 先按年龄在按身高排序(多个参数写出数组形式)

<ul>
 <li ng-repeat="item2 in items2|orderBy:['age','stature']">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>

效果展示:

先按年龄在按身高排序(多个参数写出数组形式)
name nick
age 25
stature 170
name ljy
age 27
stature 165
name xzl
age 27
stature 175
name zyh
age 29
stature 165

7 先按年龄升序在按身高降序(多个参数写出数组形式)

 在参数前加负号即可实现倒序

<ul>
 <li ng-repeat="item2 in items2|orderBy:['age','-stature']">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>

效果展示:

!!7 先按年龄升序在按身高降序(多个参数写出数组形式)
name nick
age 25
stature 170
name xzl
age 27
stature 175
name ljy
age 27
stature 165
name zyh
age 29
stature 165

个人觉得ng内置的过滤器好多都比较鸡肋。个性化的需求自定义的过滤器吧。

自定义过滤器

自定义过滤器就是返回一个函数,函数又返回你要的值即可!

实例:

angular.module('youAppName',[])
 .filter('youFilterName',function(){
  return function(){
  //你的处理代码
  return result;//返回你要的值
  }
 })

自定义一个求和的过滤器

html

 <ul>
 <li>!!1 求和</li>
 <li ng-repeat="item1 in items1">
 <div ng-bind="item1.male | sumNick:item1.female:item1.gay"></div>
 </li>
 </ul>

用法:

管道前后所有参数即为和

js

var nickAppModule=angular.module('nickApp',[]);
 nickAppModule
 //求和
 .filter('sumNick',function(){
  return function(){
  var arr=Array.prototype.slice.call(arguments),sum=0;
  for(var i= 0,len=arr.length;i<len;i++){
  sum+=arr[i]?arr[i]:0;
  }
  return sum;
  }
 })

arguments--函数接受的参数集合,类数组;

Array.prototype.slice.call(arguments)

这句将类数组转为数组;

 sum+=arr[i]?arr[i]:0;

总和sum等于数组的每个元素累加的和。避免后台为传值,而又将次参数传人自定义filer函数作为参数,容错时写成0保险。

自定义一个求百分百的过滤器(求保留小数点后两位百分比)

html

<ul ng-repeat="item1 in items1">
 <li>!!2 求百分比</li>
 <li>
 <b>male</b>
 <i ng-bind="item1.male|percentNick:item1.female:item1.gay"></i>
 </li>
 <li>
 <b>female</b>
 <u ng-bind="item1.female|percentNick:item1.male:item1.gay"></u>
 </li>
 <li>
 <b>gay</b>
 <s ng-bind="item1.gay|percentNick:item1.female:item1.male"></s>
 </li>
 </ul>

用法:

分子写在管道前面,管道后面的所有参数和加管道前的参数和则为分母

js

var nickAppModule=angular.module('nickApp',[]);
 nickAppModule
//百分比
 .filter('percentNick',function(){
  return function(){
  var arr=Array.prototype.slice.call(arguments),sum=0;
  for(var i= 0,len=arr.length;i<len;i++){
  sum+=arr[i]?arr[i]:0;
  }
  //0/0也是nan
  return sum==0?'0%':Math.round((arr[0]?arr[0]:0)/sum*10000)/100+"%";
  }
 })

这里就是在上面求和的filter上多了一句:

sum==0?'0%':Math.round((arr[0]?arr[0]:0)/sum*10000)/100+"%"

Math内置函数,Math.round四舍五入保留整数;

将总和乘以10000除以100拼接百分比号,即保留两位小数。

完整代码:

<!DOCTYPE html>
<html lang="zh-CN" ng-app="nickApp">
<head>
 <meta charset="UTF-8">
 <title>ng filter nick</title>
</head>
<body ng-controller="nickCtrl">
 <ul>
 <li>!!1 求和</li>
 <li ng-repeat="item1 in items1">
 <div ng-bind="item1.male | sumNick:item1.female:item1.gay"></div>
 </li>
 </ul>
 <ul ng-repeat="item1 in items1">
 <li>!!2 求百分比</li>
 <li>
 <b>male</b>
 <i ng-bind="item1.male|percentNick:item1.female:item1.gay"></i>
 </li>
 <li>
 <b>female</b>
 <u ng-bind="item1.female|percentNick:item1.male:item1.gay"></u>
 </li>
 <li>
 <b>gay</b>
 <s ng-bind="item1.gay|percentNick:item1.female:item1.male"></s>
 </li>
 </ul>
 <ul>
 <li>3 按年龄排序(默认升序)</li>
 <li ng-repeat="item2 in items2|orderBy:'age'">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>
 <ul>
 <li>4 按年龄排序(加参数true则为倒序即降序)</li>
 <li ng-repeat="item2 in items2|orderBy:'age':true">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>
 <ul>
 <li>5 想先按年龄升序在按身高降序(全是降序了,达不到效果,见第7例)</li>
 <!--<li ng-repeat="item2 in items2|orderBy:'age':'-stature'">-->
 <li ng-repeat="item2 in items2|orderBy:'age':'stature':true">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>
 <ul>
 <li>6 先按年龄在按身高排序(多个参数写出数组形式)</li>
 <li ng-repeat="item2 in items2|orderBy:['age','stature']">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>
 <ul>
 <li>!!7 先按年龄升序在按身高降序(多个参数写出数组形式)</li>
 <li ng-repeat="item2 in items2|orderBy:['age','-stature']">
 <div>
 <b>name</b>
 <u ng-bind="item2.name"></u>
 </div>
 <div>
 <b>age</b>
 <i ng-bind="item2.age"></i>
 </div>
 <div>
 <b>stature</b>
 <i ng-bind="item2.stature"></i>
 </div>
 </li>
 </ul>
 <ul>
 <li>8 日期1</li>
 <li ng-bind="date|date:'yyyy/MM/dd hh:mm:ss EEEE'"></li>
 <li>2016/11/19 11:59:05 Saturday</li>
 <li>8 日期2</li>
 <li ng-bind="date|date:'yyyy年MM月dd日 h:mma EEEE'"></li>
 <li>2016年11月19日 12:01PM Saturday</li>
 <li>8 日期3</li>
 <li ng-bind="date|date:'yyyy年MM月dd日 hh时mm分ss秒'"></li>
 <li>2016年11月22日 10时42分09秒</li>
 <li>8 日期4</li>
 <li ng-bind="date|date:'yyyy/MM/dd hh:mm:ss'"></li>
 <li>2016/11/22 11:16:58</li>
 </ul>
 <div>{{100000|currency:'¥'}}<!--¥可以写成$或其他--></div>
 <ul>
 <li>filter 匹配子串(以下写法只是方便观察)</li>
 <li>{{ webArr | filter : 'n' }} <!--匹配属性值中含有n的--></li>
 <li>{{ webArr | filter : 25 }} <!--匹配属性值中含有25的--></li>
 <li>{{ webArr | filter : {name : 'l'} }} <!--//参数是对象,匹配name属性中含有l的--></li>
 <li>{{ webArr | filter : fun }} <!--/参数是函数,指定返回age>25的--></li>
 </ul>
 <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
 <script>
 var nickAppModule=angular.module('nickApp',[]);
 nickAppModule
 //求和
 .filter('sumNick',function(){//管道前后所有参数和
  return function(){
  var arr=Array.prototype.slice.call(arguments),sum=0;
  for(var i= 0,len=arr.length;i<len;i++){
  sum+=arr[i]?arr[i]:0;
  }
  return sum;
  }
 })
 //百分比
 .filter('percentNick',function(){//小数点后两位百分比 分子写在管道前面,管道后面的所有参数和加管道前的参数和为分母
  return function(){
  var arr=Array.prototype.slice.call(arguments),sum=0;
  for(var i= 0,len=arr.length;i<len;i++){
  sum+=arr[i]?arr[i]:0;
  }
  //0/0也是nan
  return sum==0?'0%':Math.round((arr[0]?arr[0]:0)/sum*10000)/100+"%";
  }
 })
 </script>
<script>
 nickAppModule
 .controller('nickCtrl',['$scope',function($scope){
 $scope.items1=[{
  male:66,
  female:23,
  gay:5,
  other:'xxx',
  msg:'xxx'
 },
  {
  male:16,
  female:8,
  gay:7,
  other:'xxx',
  msg:'xxx'
  }];
 $scope.items2=[
  {
  name:'ljy',
  age:27,
  stature:165
  },
  {
  name:'nick',
  age:25,
  stature:170
  },
  {
  name:'xzl',
  age:27,
  stature:175
  },
  {
  name:'zyh',
  age:29,
  stature:165
  }];
 $scope.date=new Date();
 $scope.webArr = [
  {name:'nick',age:25},
  {name:'ljy',age:28},
  {name:'xzl',age:28},
  {name:'zyh',age:30}
 ];
 $scope.fun = function(e){return e.age>25;};
 }])
</script>
</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# angularjs  # filter  # Angularjs过滤器实现动态搜索与排序功能示例  # Angularjs使用过滤器完成排序功能  # AngularJS常见过滤器用法实例总结  # AngularJs 常用的过滤器  # 详解AngularJS中$filter过滤器使用(自定义过滤器)  # AngularJS过滤器filter用法总结  # Angular实现的自定义模糊查询、排序及三角箭头标注功能示例  # AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)  # AngularJS 过滤与排序详解及实例代码  # AngularJS ng-table插件设置排序  # Angular实现的内置过滤器orderBy排序与模糊查询功能示例  # 升序  # 按年  # 降序  # 多个  # 自定义  # 则为  # 两位  # 中含有  # 显示效果  # 达不到  # 你要  # 写在  # 和加  # 一句  # 将会  # 很简单  # 或其他  # 作为一个  # 几位  # 在上面 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Android自定义listview布局实现上拉加载下拉刷新功能  Laravel怎么实现验证码(Captcha)功能  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  html5的keygen标签为什么废弃_替代方案说明【解答】  微信小程序 require机制详解及实例代码  b2c电商网站制作流程,b2c水平综合的电商平台?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  jQuery validate插件功能与用法详解  如何快速上传自定义模板至建站之星?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  JavaScript如何实现继承_有哪些常用方法  如何用免费手机建站系统零基础打造专业网站?  Laravel如何处理异常和错误?(Handler示例)  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何快速查询网站的真实建站时间?  免费网站制作appp,免费制作app哪个平台好?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  如何在Ubuntu系统下快速搭建WordPress个人网站?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何在自有机房高效搭建专业网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  音乐网站服务器如何优化API响应速度?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  如何在IIS中新建站点并配置端口与IP地址?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  nginx修改上传文件大小限制的方法  在centOS 7安装mysql 5.7的详细教程  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何快速搭建二级域名独立网站?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  5种Android数据存储方式汇总  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Java解压缩zip - 解压缩多个文件或文件夹实例