2017-01-19 2 views
2

私は次の配列があります。私は私が欲しいもの配列からフィルターメンバーをフィルターする方法は?

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

企業listendいる

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

を: 私は、例えばリストしますメンバー 'ニック'だけがどこですか?私はどんなフィルタを書くべきですか?

'nick'と 'john'が配列のどこにあるのかをリストしたいと思います。フィルタに何を書き込むのですか? は、フィルタパラメータ

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

を設定しようとしたが、それは事前にあなたより を動作しません。そのように

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

次に使用します:

+0

あなたはニックがメンバーや場所ニックのレコードを一覧表示したいですジョンはどちらもメンバーですか? –

+0

私はリスト2 cases.separately – Serhiy

答えて

0

は、あなたは、あなたのフィルターのparamに一致する少なくとも一つのアイテムを見つけることができるかどうかを確認するために(すなわち、それはmembers属性です)あなたの値にリストに調べる必要があり

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

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

注:それらをパイプすると、影響すること積極的に "AND"効果を生み出します。これは最もパフォーマンスの良い結果ではありませんが、小さなリストの場合は問題ありません。

また、配列をparamとして渡し、フィルタ関数でANDチェックを行うこともできます。これはもう少しですパフォーマンス:

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> 

ない:eは用everyを使用して、簡単にOR効果をsomeに変更することができます。あなたもなど、操作の種類をパラメータ化することができます

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

次に、あなたは、OR効果のためにも、それを使用することができます。

<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

編集を参照してください - それを得る方法と、必要に応じてさらにフィルタをカスタマイズする方法について説明しています –

関連する問題