如何使用AngularJS过滤数组,并使用过滤对象的属性作为ng-model属性?

如果我有一个对象数组,并且我想要将Angular模型绑定到基于filter的其中一个元素的属性,那么我该怎么做? 我可以用一个具体的例子来更好地解释:

HTML:

<!DOCTYPE html> <html ng-app> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> <meta charset=utf-8 /> <title>JS Bin</title> </head> <body ng-controller="MyCtrl"> <input ng-model="results.year"> <input ng-model="results.subjects.title | filter:{grade:'C'}"> </body> </html> 

控制器:

 function MyCtrl($scope) { $scope.results = { year:2013, subjects:[ {title:'English',grade:'A'}, {title:'Maths',grade:'A'}, {title:'Science',grade:'B'}, {title:'Geography',grade:'C'} ] }; } 

JSBin: http : //jsbin.com/adisax/1/edit

我想过滤第二个input到“C”级的主题,但是我不想把模型绑定到等级上 ; 我想将它绑定到具有“C”级的主题的标题

这是可能的,如果是这样,它是如何做的?

 <div ng-repeat="subject in results.subjects | filter:{grade:'C'}"> <input ng-model="subject.title" /> </div> 

您可以使用控制器中的“filter”filter来获得所有的“C”等级。 获得结果数组的第一个元素将会给你带有等级“C”的主题的标题

 $scope.gradeC = $filter('filter')($scope.results.subjects, {grade: 'C'})[0]; 

http://jsbin.com/ewitun/1/edit

与普通的ES6相同:

 $scope.gradeC = $scope.results.subjects.filter((subject) => subject.grade === 'C')[0] 

这是一个带有工作示例的修改的JSBin:

http://jsbin.com/sezamuja/1/edit

这是我在input中用filter做的事情:

 <input ng-model="(results.subjects | filter:{grade:'C'})[0].title"> 

如果你想在控制器中创build一个单独的结果列表,你可以应用一个filter

 function MyCtrl($scope, filterFilter) { $scope.results = { year:2013, subjects:[ {title:'English',grade:'A'}, {title:'Maths',grade:'A'}, {title:'Science',grade:'B'}, {title:'Geography',grade:'C'} ] }; //create a filtered array of results //with grade 'C' or subjects that have been failed $scope.failedSubjects = filterFilter($scope.results.subjects, {'grade':'C'}); } 

然后,您可以按照引用结果对象的相同方式引用failedSubjects

你可以在这里阅读更多关于https://docs.angularjs.org/guide/filter

因为这个答案angular度已经更新了他们现在build议调用filter的文档

 // update // eg: $filter('filter')(array, expression, comparator, anyPropertyKey); // becomes $scope.failedSubjects = $filter('filter')($scope.results.subjects, {'grade':'C'}); 

请注意,如果您使用$filter是这样的:

 $scope.failedSubjects = $filter('filter')($scope.results.subjects, {'grade':'C'}); 

而你碰巧还有另外一个等级,哦,我不知道,CC或AC或C +或CCC把他们拉进去。 您需要附加完全匹配的要求:

 $scope.failedSubjects = $filter('filter')($scope.results.subjects, {'grade':'C'}, true); 

当我拿出一些这样的佣金细节时,这真的杀了我:

 var obj = this.$filter('filter')(this.CommissionTypes, { commission_type_id: 6}))[0]; 

只会被调用一个错误,因为它提供了佣金ID 56而不是6。

添加真实的强制精确匹配。

 var obj = this.$filter('filter')(this.CommissionTypes, { commission_type_id: 6}, true))[0]; 

然而,我更喜欢这个(我使用打字稿,因此“Let”和=>):

 let obj = this.$filter('filter')(this.CommissionTypes, (item) =>{ return item.commission_type_id === 6; })[0]; 

我这样做是因为,在某个时候,我可能想从过滤的数据中获得更多的信息等等。

你也可以用$filter('filter')来使用函数

 var foo = $filter('filter')($scope.results.subjects, function (item) { return item.grade !== 'A'; });