【问题标题】:AngularJs Filter an array by another arrayAngularJs通过另一个数组过滤一个数组
【发布时间】:2014-06-06 08:26:50
【问题描述】:

我在一个控制器中有三个数组:

  1. $scope.allUsers 包含:id:name 的所有用户。例如。喜欢this
  2. $scope.job.delegated_to 包含与工作委派相关的信息。看起来像这样。
    $scope.job.delegated_to = [
      {id: 5, user_id:33, user_name:"Warren", hour_count:4},
      {id: 5, user_id:18, user_name:"Kelley", hour_count:2},
      {id: 5, user_id:10, user_name:"Olson", hour_count:40},
      {id: 5, user_id:42, user_name:"Elma", hour_count:2},
      {id: 5, user_id:45, user_name:"Haley", hour_count:4},
      {id: 5, user_id:11, user_name:"Kathie", hour_count:3}
     ]
  1. $scope.freeUsers 必须包含所有用户,而不是委派给工作。

我添加了一块手表

$scope.$watch('job.delegated_to.length', function(){
  $scope.freeUsers = filterUsers( $scope.allUsers, $scope.job.delegated_to );
});

但还不能构造一个有效的过滤器。

【问题讨论】:

  • 虽然@dubadub 正确回答了 OP 问题,但我认为 OP 可能还有其他含义:使用可用于 ng-repeat 指令的角度 $Filter。 @Almaron 你能澄清一下吗?
  • @alonisser,无论哪种方式都可以。无论哪个工作。
  • 请注意,这种过滤器只能在控制器中使用。如果你想在模板中使用 ``` ng-repeat freeUsers | nonAssignedUsers```您必须将建议的过滤器之一封装在角度$Filter
  • @alonisser 注意到了,谢谢。

标签: javascript arrays angularjs


【解决方案1】:

您的 filterUsers 函数如下:

var filterUsers = function(allUsers, jobs) {
    var freeUsers = allUsers.slice(0); //clone allUsers
    var jobUserIds = [];
    for(var ind in jobs) jobUserIds.push(jobs[ind].user_id);
    var len = freeUsers.length;
    while(len--){
      if(jobUserIds.indexOf(allUsers[len].id) != -1)  freeUsers.splice(len, 1);
    }    
    return freeUsers;
}

结帐小提琴http://jsfiddle.net/cQXBv/

【讨论】:

    【解决方案2】:

    我建议使用像Lo-Dash 这样的库,它有很多有用的实用功能。然后,您可以将过滤器函数编写为:

    function filterUsers(allUsers, delegatedTo) {
        var delegatedIndex = _.indexBy(delegatedTo, 'user_id');
        return _.reject(allUsers, function(user) {return user.id in delegatedIndex});
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 2015-11-29
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      相关资源
      最近更新 更多