You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS如何实现基于月份名称/年份的自定义列表过滤?

当然可以实现这个需求!你有两种非常实用的方式来搞定这个多维度搜索的场景,我结合你现有的代码给你一步步拆解:

方案一:使用自定义过滤函数

这种方式适合逻辑简单、只在当前控制器内使用的场景,直接在$scope里定义一个过滤函数,把每个项的月份转成名称后再和搜索词匹配:

首先修改你的控制器代码,注入$filter服务并添加过滤函数:

// 记得在控制器注入$filter
app.controller('YourController', ['$scope', '$filter', function($scope, $filter) {
  $scope.monthYr = [
    {month:"1", year: "2014"},
    {month:"2", year: "2015"},
    {month:"3", year: "2016"}
  ];

  $scope.searchTerm = '';

  // 自定义过滤函数
  $scope.filterMonthYear = function(item) {
    // 调用已有的monthName过滤器转换月份
    const monthName = $filter('monthName')(item.month);
    // 拼接成和页面展示一致的格式
    const fullDisplayText = `${monthName} (${item.year})`;
    
    // 搜索词为空时返回所有项,否则做不区分大小写的匹配
    if (!$scope.searchTerm.trim()) return true;
    return fullDisplayText.toLowerCase().includes($scope.searchTerm.trim().toLowerCase());
  };
}]);

// 你已有的monthName过滤器
app.filter('monthName', [function() {
  return function (monthNumber) {
    var monthNames = [ 
      'January', 'February', 'March',
      'April', 'May', 'June',
      'July', 'August', 'September',
      'October','November', 'December' 
    ];
    return monthNames[monthNumber - 1];
  }
}]);

然后修改HTML,添加搜索输入框并在ng-repeat中使用这个过滤函数:

<input type="text" ng-model="searchTerm" placeholder="搜索月份/年份(比如March或2016)">

<div ng-repeat="item in monthYr | filter:filterMonthYear">
  {{item.month | monthName}} &nbsp;({{item.year}})
</div>

方案二:自定义可复用搜索过滤器

如果这个搜索逻辑需要在多个页面或控制器复用,推荐把它封装成一个独立的过滤器,依赖你已有的monthName过滤器:

// 自定义搜索过滤器,依赖monthName和$filter
app.filter('searchMonthYear', ['$filter', function($filter) {
  return function(items, searchTerm) {
    // 无搜索词时直接返回所有项
    if (!searchTerm || !searchTerm.trim()) return items;
    
    const lowerSearch = searchTerm.trim().toLowerCase();
    // 遍历数组,匹配月份名称、年份或完整格式
    return items.filter(item => {
      const monthName = $filter('monthName')(item.month);
      const fullText = `${monthName} (${item.year})`.toLowerCase();
      
      return fullText.includes(lowerSearch) || 
             monthName.toLowerCase().includes(lowerSearch) ||
             item.year.toLowerCase().includes(lowerSearch);
    });
  };
}]);

// 你已有的monthName过滤器保持不变
app.filter('monthName', [function() {
  return function (monthNumber) {
    var monthNames = [ 
      'January', 'February', 'March',
      'April', 'May', 'June',
      'July', 'August', 'September',
      'October','November', 'December' 
    ];
    return monthNames[monthNumber - 1];
  }
}]);

对应的HTML使用方式:

<input type="text" ng-model="searchTerm" placeholder="搜索月份/年份...">

<div ng-repeat="item in monthYr | searchMonthYear:searchTerm">
  {{item.month | monthName}} &nbsp;({{item.year}})
</div>

两种方案都支持用户输入月份名称(比如March)、年份(比如2016)或者完整格式(比如March (2016)),而且都是不区分大小写的匹配,体验更友好。

内容的提问来源于stack exchange,提问作者Abhinandan Khilari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:19:36