Подтвердить что ты не робот

Как использовать Regex с ng-repeat в AngularJs?

Я хочу использовать регулярное выражение в ng-repeat. Я пробовал следующий код, но не работал.

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

У меня есть массив пользователей, и я хочу отображать только пользователей с типом c5.

Если я использую

filter:{'type':'c5'} 

тогда он отображает пользователей с типом "ac5x", потому что в нем содержится c5.

Как я могу решить эту проблему? Возможно, есть еще одно решение.

Спасибо!

4b9b3361

Ответ 1

То, что упоминает 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>

Ответ 2

Вы можете использовать функцию в выражении фильтра. Таким образом, вы можете сделать любую фильтрацию с помощью javascript.

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

В контроллере:

$scope.myFilter = function(user) {
   return /^c5$/.test(user.type);
};

Ответ 3

Глопический ответ - спот. Я реализовал его на своем сайте, но я получал сообщение об ошибке,

'input' is undefined

Это произошло потому, что я иногда перебирал ничего. Я исправил это, добавив условие, чтобы вернуть пустой массив, если вход был undefined.

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

Надеюсь, это поможет кому-то, у кого может быть такая же проблема.

Ответ 4

Регулярные выражения действительно мощные и могут обрабатывать все виды совпадений, включая точное совпадение, например ^c5$.

Тем не менее, основная часть этого вопроса показывает, что проблема будет решена путем постоянной фильтрации по точным совпадениям.

Вы можете указать, что фильтр Angular должен использовать компаратор точного соответствия, установив для третьего аргумента значение true:

filter:{type:'c5'}:true

Ответ 5

Спасибо за идею фильтра регулярных выражений, но предыдущие решения не работают в общем случае, например, в случае объекта, где есть многоуровневые поля.

Например:

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

Он работает для объектов с несколькими уровнями или простого объекта с одним уровнем атрибутов.

Поздно, но надеюсь, что это поможет вам увидеть с разных сторон.

Это код в 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