2017-01-19 3 views
2

У меня есть следующий массив:Как создать фильтр, который фильтрует элементы из массива?

var companies = [ 
     { 
      id:1, 
      members : ['alex', 'john','nick'] 
     }, 
     { 
      id:2, 
      members : ['alex', 'john','nick'] 
     }, 
     { 
      id:3, 
      members : ['alex'] 
     }, 
     { 
      id:3, 
      members : ['nick'] 
     } 
    ] 

Я listend компании в

<div ng-repeat=comp in companies |filter: someFilter>{{comp.id}}</div> 

Что я хочу: я хочу перечислить, например, только comp, где только член «ник»? какой фильтр я должен писать?

Я хочу указать, где 'nick' и 'john' находятся в массиве. что писать в фильтре? Пробовал установить фильтр параметров

{members: ["cuan", "john"]} 

Но это не работает Чем вы заранее.

+0

вы хотите перечислить запись, где ник зарегистрирован или где ник и john оба являются членами? –

+0

Я хочу список 2 case.separately – Serhiy

ответ

0

Вы должны смотреть в список в вашей стоимости (т.е. это members атрибут), чтобы увидеть, если вы можете найти по крайней мере один элемент, отвечающий условиям вашего фильтра из параметров:

angular.module('app', []) 
.filter('myfilter', function() { 
    return function(value, expected) { 
    return value && value.members && (value.members || []).indexOf(expected) >= 0; // this checks if at least one value from members matches the given filter param 
    }; 
}) 

Затем используйте его в качестве такового:

<div ng-repeat=comp in companies | myfilter:'nick'>{{comp.id}}</div> 

и

<div ng-repeat=comp in companies | myfilter:'nick' | myfilter:'john'>{{comp.id}}</div> 

Примечание: что обжигающе их будет эффект активировать эффект «И». Теперь это не самый результативный результат, но для небольших списков это не проблема.

В качестве альтернативы вы можете разрешить передачу массива в качестве параметра и выполнить проверку «И» в функции фильтра - это будет немного больше производительным:

angular.module('app', []) 
.filter('myfilter', function() { 
    return function(value, expected) { 
    return value && value.members && 
     (expected || []).every(function(exp) { return value.members.indexOf(exp) >= 0; }) 
    }; 
}) 

Затем используйте как:

<div ng-repeat=comp in companies | myfilter:['nick','john']>{{comp.id}}</div> 

Не: е используйте every для AND, могут быть легко изменены, чтобы some для эффекта ИЛИ. Вы даже можете параметризовать тип операции, как таковой:

.filter('myfilter', function() { 
    return function(value, type, expected) { 
    return value && value.members && 
     (expected || [])[type](function(exp) { return value.members.indexOf(exp) >= 0; }) 
    }; 
}) 

Затем вы можете использовать его также для эффекта ИЛИ:

<div ng-repeat=comp in companies | myfilter:'every':['nick','john']>{{comp.id}}</div> 

<div ng-repeat=comp in companies | myfilter:'some':['nick','john']>{{comp.id}}</div> 
+0

как передать массив как параметр? Потому что, если у меня есть много членов, как добавить много «| myfilter:« name »? – Serhiy

+0

см. В редакторе - объяснил, как вы можете получить это и даже настроить свой фильтр, если хотите –