AngularJs按另一个数组过滤数组

时间:2014-06-06 08:26:50

标签: javascript arrays angularjs

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

  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} ]

  3. $scope.freeUsers必须包含所有用户,而不是委托给该职位。

  4. 我添加了一块手表

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

    但无法构建工作过滤器。

2 个答案:

答案 0 :(得分:3)

您的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/

答案 1 :(得分:2)

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

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