please note, if you use $filter like this:
$scope.failedSubjects = $filter('filter')($scope.results.subjects, {'grade':'C'});
and you happened to have another grade for, Oh I don't know, CC or AC or C+ or CCC it pulls them in to. you need to append a requirement for an exact match:
$scope.failedSubjects = $filter('filter')($scope.results.subjects, {'grade':'C'}, true);
This really killed me when I was pulling in some commission details like this:
var obj = this.$filter('filter')(this.CommissionTypes, { commission_type_id: 6}))[0];
only get called in for a bug because it was pulling in the commission ID 56 rather than 6.
Adding the true forces an exact match.
var obj = this.$filter('filter')(this.CommissionTypes, { commission_type_id: 6}, true))[0];
Yet still, I prefer this (I use typescript, hence the "Let" and =>):
let obj = this.$filter('filter')(this.CommissionTypes, (item) =>{
return item.commission_type_id === 6;
})[0];
I do that because, at some point down the road, I might want to get some more info from that filtered data, etc... having the function right in there kind of leaves the hood open.