根据年份范围过滤对象

时间:2014-07-28 14:46:48

标签: javascript angularjs filter

我想在一年的范围内过滤对象。

我的对象看起来像这样:

students = [ {studentId: 1, 
              studentName: 'Alex',
              studentClass: 1,
              studentBirth: 1345262400000},

             {studentId: 2,
              studentName: 'Bob',
              studentClass: 1,
              studentBirth: 1345608000000},
              ...
             ];

我想找一些出生年份的学生> 1994年&&出生年份< 2000.另外,我想根据学生的课程缩小范围。

我写了这样的代码:

var targetStudent = {};
targetStudent['studentClass'] = 1;
students = $filter('filter')(students, targetStudent);

通过上面的代码,我可以找到班级为1的学生,但我不知道如何根据年份过滤掉。

我可以这样写:

students = $filter('filter')(students, function(student) {
    if(new Date(student.studentBirth).getFullYear() < 2000 && new Date(student.studentBirth).getFullYear() > 1994)
        return true;
    else
        return false;
});

但我想创建一个对象来寻找学生。有可能吗?

1 个答案:

答案 0 :(得分:1)

你实际上非常接近回答你自己的问题。使用自定义过滤器功能时,您可以返回该对象,然后您将获得一个对象数组。

students = $filter('filter')(students, function(student) {
    if(new Date(student.studentBirth).getFullYear() < 2000 && new Date(student.studentBirth).getFullYear() > 1994) {
        return student;
    }
});

除非只使用一次,即便如此,我还会选择更可重用的东西:

$scope.getStudentsForRange = function(studentList, fromYear, toYear) {
    return $filter('filter')(studentList, function(student) {
        var studentBirthYear = new Date(student.studentBirth).getFullYear();

        if(studentBirthYear < toYear && studentBirthYear > fromYear) {
            return student;
        }
    };
};

您可以这样使用:$scope.getStudentsForRange(students, 1994, 2000)

这有一个额外的好处,就是只创建一个新的Date对象,保持干燥。

修改

听起来你想要一个自定义过滤器。

angular.module('rootApp', []).filter('studentFilter', function() {
    return function(students, studentFilter) {
        return $filter('filter')(students, function(student) {
            var birthYear = new Date(student.studentBirth).getFullYear();

            if(student.studentClass === studentFilter.studentClass && birthYear < studentFilter.toYear && studentFilter.birthYear > fromYear) {
                return student;
            }
        };
    };
});

可以在模板中使用:{{ students | studentFilter:{studentClass: 1, fromYear: 1994, toYear: 2000} }}

或在控制器/指令内:

var targetStudent = {
    studentClass: 1,
    fromYear: 1994,
    toYear: 2000
};

students = $filter('studentFilter')(students, targetStudent);