Javascript 如何使用AngularJS对多个对象应用过滤器?

Javascript 如何使用AngularJS对多个对象应用过滤器?,javascript,angularjs,javascript-framework,Javascript,Angularjs,Javascript Framework,我将用户对象定义如下 $scope.users = [{id: 1, name: 'Adam', friends: [{name: 'John', age: 21, sex: 'M'}, {name: 'Brad', age: 32, sex: 'M'}]}] 然后我有以下代码: <div ng-repeat="user in users> <input type="text" ng-model="searchText"> <div ng-repeat="fr

我将用户对象定义如下

$scope.users = [{id: 1, name: 'Adam', friends: [{name: 'John', age: 21, sex: 'M'}, {name: 'Brad', age: 32, sex: 'M'}]}]
然后我有以下代码:

<div ng-repeat="user in users>
 <input type="text" ng-model="searchText">
 <div ng-repeat="friend in user.friends | filter:searchText">
  {{user.name}} {{friend.name}} {{friend.age}}
 </div>
</div>


因为您想同时过滤两件事——好友数组的一些属性和用户——所以您需要创建自己的,并接受两个附加参数:

myApp.filter('myFilter', function() {
  return function(friends, searchText, username) {
    var searchRegx = new RegExp(searchText, "i");
    if ((searchText == undefined) || (username.search(searchRegx) != -1)) {
        return friends;
    }
    var result = [];
    for(i = 0; i < friends.length; i++) {
        if (friends[i].name.search(searchRegx) != -1 || 
            friends[i].age.toString().search(searchText) != -1) {
            result.push(friends[i]);
        }
    }
    return result;
  }
});
myApp.filter('myFilter',function(){
返回函数(朋友、搜索文本、用户名){
var searchRegx=新的RegExp(searchText,“i”);
if((searchText==未定义)| |(username.search(searchRegx)!=-1)){
回报朋友;
}
var结果=[];
对于(i=0;i
那么就这样称呼它:

<div ng-repeat="user in users">
   <input type="text" ng-model="searchText">
   <div ng-repeat="friend in user.friends | myFilter:searchText:user.name">
      {{user.name}} {{friend.name}} {{friend.age}}
    </div>
</div>

{{user.name}{{friend.name}{{{friend.age}
“:searchText:user.name”是向自定义筛选器传递附加参数的方式


.

谢谢!这有帮助!但这将过滤的对象是什么?该过滤器是否仅根据用户名、朋友的姓名和年龄进行过滤?如文档中所述,它将在对象数组中搜索对象的所有属性。你可以把
$
想象成一个神奇的通配符。谢谢fastreload!在我的朋友对象中,我有三个属性:姓名、年龄和性别。但我不想让性被搜索到。有什么方法可以实现这一点吗?您需要创建一个函数,该函数接受数组中的一个元素,并根据需要生成true/false,然后将函数名作为
filter
s参数传递。“函数:谓词函数可用于编写任意筛选器。为数组的每个元素调用该函数。最终结果是谓词返回true的元素数组。”非常感谢Mark!但是这个过滤器(friends,searchText)会过滤朋友的所有对象,即姓名、年龄和性别,或者只过滤姓名和年龄。我的要求是,我只希望“姓名”和“年龄”可以搜索,结果只能在朋友的这两个对象上过滤,因为这些是显示的字段,而不是“性别”字段。我知道这有多大了。。。但是,当我的输入的“searchText”在过滤器中始终未定义时,会发生什么情况?范围界定问题,很明显,但为什么?@聪明,我建议你创建一个新问题,包括你的HTML和过滤器。这对我非常有帮助,谢谢!我要补充的唯一一点是,我第一眼就忽略了,当您在ng repeat参数中指定过滤器时,请确保用过滤器的名称替换通常的“filter:”(又名“myFilter:”)。另外,在返回函数的第一行中,检查searchText中的字母“i”,不能100%确定您在做什么。在我的解决方案中我不需要它,所以我把它拿了出来。@shaunpickford,“I”是一个意思是“忽略案例”。
<div ng-repeat="user in users">
   <input type="text" ng-model="searchText">
   <div ng-repeat="friend in user.friends | myFilter:searchText:user.name">
      {{user.name}} {{friend.name}} {{friend.age}}
    </div>
</div>