2014-06-06 2 views
0

У меня есть три массива в контроллере:AngularJs Фильтр массива другого массив

  1. $scope.allUsers, содержащий все пользователь с помощью :id и :name. Например. smth, как 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 которым должен содержать всех пользователей, не делегированные на работу.

Я добавил часы

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

, но не удалось построить рабочий фильтр.

+0

Хотя @dubadub отвечает на вопрос OP правильно, я думаю, что ОП может означать что-то другое: с помощью углового '' '$ Filter''', которые могут быть использованы на директив '' 'ng-repeat'''. @Almaron вы можете уточнить? – alonisser

+0

@alonisser, в любом случае это нормально. Какая бы работа ни была. – Almaron

+0

просто обратите внимание, что этот фильтр можно использовать только в контроллере. если вы хотите использовать его в шаблоне с помощью '' 'ng-repeat freeUsers | nonAssignedUsers''' вам нужно будет инкапсулировать один из предложенных фильтров в угловой [$ Filter] (https://docs.angularjs.org/guide/filter) – alonisser

ответ

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

Checkout скрипка 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}); 
} 
Смежные вопросы