我想在一年的范围内过滤对象。
我的对象看起来像这样:
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;
});
但我想创建一个对象来寻找学生。有可能吗?
答案 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);