2014-07-28 5 views
1

Я хочу фильтровать объект в течение некоторого диапазона времени.Фильтрующий объект в зависимости от диапазона года

Объект У меня есть выглядит следующим образом:

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

Нет, это не представляется возможным использовать объект в одиночку добиться того, что вы хотите. Требуется выражение пользовательской функции или пользовательский компаратор. – runTarm

ответ

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 один раз, сохраняя вещи DRY.

EDIT

Это звучит, как вы хотите пользовательский фильтр.

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); 
+0

Спасибо за ответ. Но могу ли я найти объекты, создав еще один объект? (то есть мой первый код) –

Смежные вопросы