Javascript AngularJs通过另一个数组过滤一个数组

Javascript AngularJs通过另一个数组过滤一个数组,javascript,arrays,angularjs,Javascript,Arrays,Angularjs,我在一个控制器中有三个阵列: $scope.alluser包含所有用户,按:id和:name列出。例如,smth喜欢 $scope.job.delegate_to包含与作业委派相关的信息。看起来像这样 $scope.freeUsers必须包含所有用户,而不是委派给作业的用户 我加了一块手表 $scope.$watch('job.delegated_to.length', function(){ $scope.freeUsers = filterUsers( $scope.allUsers,

我在一个控制器中有三个阵列:

  • $scope.alluser
    包含所有用户,按
    :id
    :name
    列出。例如,smth喜欢
  • $scope.job.delegate_to
    包含与作业委派相关的信息。看起来像这样
  • $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;
    }
    

    签出小提琴

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

    签出小提琴

    我建议使用类似的库,它有许多有用的实用功能。然后,您可以将筛选函数编写为:

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

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

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

    虽然@dubadub正确地回答了OP问题,但我认为OP可能意味着其他东西:使用可用于
    ng repeat
    指令的角度
    $Filter
    @阿尔马隆,你能澄清一下吗?@alonisser,两种方式都可以。请注意,这种过滤器只能在控制器中使用。如果您想在模板中与“ng repeat freeUsers | nonAssignedUsers”一起使用它,您必须将其中一个建议的过滤器封装在一个角度@alonisser注释中,谢谢。虽然@dubadub正确回答了OP问题,我认为OP可能意味着其他东西:使用一个角度
    $Filter
    ,可以在
    ng repeat
    指令上使用@阿尔马隆,你能澄清一下吗?@alonisser,两种方式都可以。请注意,这种过滤器只能在控制器中使用。如果你想在“ng repeat freeUsers | nonAssignedUsers”的模板中使用它,你必须将其中一个建议的过滤器封装在angular@alonisser中,谢谢。