18

ng-repeatで正規表現を使用したい。次のコードを試しましたが、機能しません。

<div ng-repeat="user in users | filter:{'type':/^c5$/}"></div>

ユーザー配列があり、タイプc5のユーザーのみを表示したいと思います。

使用する場合

filter:{'type':'c5'} 

次に、c5が含まれているため、タイプ「ac5x」のユーザーも表示されます。

どうすればこの問題を解決できますか?多分別の解決策があります。

ありがとう!

4

5 に答える 5

36

toshが言及することはあなたのために働くはずです!

正規表現でより頻繁にフィルタリングしたい場合は、カスタムフィルターを作成できます。このフィドルのようなものを使用すると、正規表現に対してチェックするフィールドを指定できます。

var myApp = angular.module('myApp', []);
myApp.filter('regex', function() {
  return function(input, field, regex) {
      var patt = new RegExp(regex);      
      var out = [];
      for (var i = 0; i < input.length; i++){
          if(patt.test(input[i][field]))
              out.push(input[i]);
      }      
    return out;
  };
});

このように使用'type'され、チェック対象のフィールド(この場合はtypeという名前のフィールド)を示します。

<div ng-repeat="user in users | regex:'type':'^c5$'"></div>
于 2012-08-21T01:07:16.193 に答える
16

フィルタ式で関数を使用できます。したがって、基本的には、javascriptを使用して可能な任意のフィルタリングを実行できます。

<li ng-repeat="name in names | filter:myFilter"> {{ name }}

コントローラー内:

$scope.myFilter = function(user) {
   return /^c5$/.test(user.type);
};
于 2012-08-21T00:43:34.217 に答える
1

Gloopyの答えは的確です。私は自分のサイトにそれを実装しましたが、エラーが発生していました:

'input' is undefined

これは、私が時々何もループしていなかったために発生しました。未定義のout場合に空の配列を返す条件を追加することで、これを修正しました。input

var myApp = angular.module('myApp', []);
myApp.filter('regex', function() {
  return function(input, field, regex) {
      var patt = new RegExp(regex);      
      var out = [];

      if(input === undefined) {
          return out;
      }

      for (var i = 0; i < input.length; i++){
          if(patt.test(input[i][field]))
              out.push(input[i]);
      }      
    return out;
  };
});

うまくいけば、これは同じ問題を抱えているかもしれない誰かを助けるでしょう。

于 2015-04-15T12:01:23.600 に答える
1

正規表現は確かに強力であり、のような完全一致を含むすべての種類の一致を処理でき^c5$ます。

ただし、この質問の本文は、常に完全一致でフィルタリングすることで問題が解決されることを示しています。

3番目の引数を次のように設定することで、Angularフィルターが完全一致コンパレーターを使用するように指定できますtrue

filter:{type:'c5'}:true
于 2017-02-02T03:40:03.857 に答える
0

正規表現フィルターのアイデアに感謝しますが、以前のソリューションは、マルチレベルフィールドであるオブジェクトケースのような一般的なケースでは機能しません。

例えば:

<div ng-repeat="item in workers | regex:'meta.fullname.name':'^[r|R]' ">

私の解決策は次のとおりです。

.filter('regex', function() {
  return function(input, field, regex) {
    var f, fields, i, j, out, patt;
    if (input != null) {
      patt = new RegExp(regex);
      i = 0;
      out = [];
      while (i < input.length) {
        fields = field.split('.').reverse();
        j = input[i];
        while (fields.length > 0) {
          f = fields.pop();
          j = j[f];
        }
        if (patt.test(j)) {
          out.push(input[i]);
        }
        i++;
      }
      return out;
    }
  };
});

これは、マルチレベルのオブジェクトまたは1つのレベルの属性を持つ単純なオブジェクトに対して機能します。

遅くなりますが、別の角度から見るのに役立つことを願っています。

これはCoffeeScriptのコードであり、よりクリーンです。

angular.module('yourApp')
    .filter 'regex', ->
        (input, field, regex) ->
            if input?
                patt = new RegExp(regex)
                i = 0
                out = []
                while i < input.length
                    fields = field.split('.').reverse()
                    j = input[i]
                    while fields.length > 0
                        f = fields.pop()
                        j = j[f]
                    if patt.test(j)
                        out.push input[i]
                    i++
                return out
于 2015-09-30T00:09:51.857 に答える