用一个数组过滤另一个数组

AngularJs Filter an array by another array

本文关键字:数组 过滤 另一个 一个      更新时间:2023-09-26

控制器中有三个数组:

  1. $scope.allUsers包含:id:name的所有用户。例如:像这样。
  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}
     ]
  • $scope.freeUsers必须包含所有用户,而不是委托给作业。
  • 我添加了一个手表

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

    ,但无法构建一个工作过滤器。

    你的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;
    }
    

    Checkout fiddle http://jsfiddle.net/cQXBv/

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

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