【问题标题】:How to filter by a specific field in an object array using $filter('filter')如何使用 $filter('filter') 按对象数组中的特定字段进行过滤
【发布时间】:2014-05-16 02:30:20
【问题描述】:

我想使用 $filter('filter') 过滤员工对象数组,以仅根据可以从下拉/选择中选择的员工名字字段过滤结果。注意我不想在 ng-repeat 中使用“| filter:”。

困难在于name字段是另一个名为'details'的字段的属性,所以我不能像下面的代码那样使用details.name,因为它会出错。

$scope.filteredEmployees = $filter('filter')(employees, {details.name: selectedName }); 

有关员工数组对象的结构,请参见下文。

如何告诉它使用 $filter('filter') 根据 details.name 字段过滤记录?

提前感谢您的帮助!

代码如下:

Var selectedName = “An”;
$scope.filteredEmployees = $filter('filter')(employees, {**details.name:** selectedName });
Var employees  = [
      {
        Date: 01/01/2012
        details: {
          name: ‘An’,
      age: 25

        }
      },
      {
        Date: 01/01/2012
        details: {
          name: ‘'Bill',
      age: 20

        }
            }];

    //Here is 
    <select ng-model="selectedName" ng-options="e for e in employees" data-ng-show="employees.length > 0" ng-change="filterEmployees">
        <option value="">All Employees</option>
    </select><br>

    function filterEmployees()  {
        $scope.filteredEmployees = $filter('filter')(employees, "Joe");
    };

【问题讨论】:

    标签: angularjs angularjs-filter


    【解决方案1】:

    表达式可以是map of property-to-filters:,其中对象中的每个属性都映射到结果集中的相应属性。

    $filter('filter')(employees, {name:"Joe"});
    

    Live Demo


    使用自定义函数

    如果您的数据更复杂,并且您需要更高级的过滤,那么您可以简单地传入一个自定义谓词函数来评估是否应该过滤某个项目。

    函数的输入将数组的每一项作为参数,如果该项应从结果集中排除,则预期返回false

    var people = [{date:new Date(), details:{
        name: 'Josh',
        age: 32
    }}, {date:new Date(), details:{
        name: 'Jonny',
        age: 34
    }}, {date:new Date(), details:{
        name: 'Blake',
        age: 28
    }}, {date:new Date(), details:{
        name: 'David',
        age: 35
    }}];
    
    $scope.filteredPeople = $filter('filter')(people, function(person){
        return /^Jo.*/g.test(person.details.name);
    });
    

    Live Demo

    【讨论】:

    • 谢谢乔希。我只是意识到我的员工数组对象具有嵌套结构。这是员工数组数组对象: var employees = [{ details: {name: 'Josh', age: 32 }, { name: 'Jonny', age: 34 }, { name: 'Blake', age: 28 }, { 姓名:“大卫”,年龄:35 }];
    • 您的样本不太有效。是哪个:{details: {name:'foo',age:32}},{details: {name:'bar',age:32}}{details: [{name:'foo',age:32},{name:'bar',age:32}]}
    • 乔希,对不起,下面是我的数据。我试图做 {details.name: selectedName},但没有奏效。如何使用变量 selectedName=”Jo” 过滤“details.name”? Var selectedName = “乔”; $scope.filteredEmployees = $filter('filter')(employees, {details.name: selectedName }); Var 员工 = [ { 日期:2012 年 1 月 1 日详细信息:{ 姓名:“乔希”,年龄:32 } },{ 日期:2012 年 1 月 1 日详细信息:{姓名:“乔尼”,年龄:34 } } ];
    • @user3439326 - 我已经更新了答案以展示如何使用谓词函数进行过滤。
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 2018-12-30
    • 2019-09-07
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    相关资源
    最近更新 更多