Массив OrderBy в AngularJS в соответствии с поиском

Я все еще застрял с проблемой OrderBy. Данные поступают из $http и выглядят так:

[
  {
    "number":1,
    "timetable": [
      {
        "name":"Station1",
        "time":"2016-05-18T18:14:00.000Z"
      },
      {
        "name":"Station2",
        "time":"2016-05-18T18:18:00.000Z"
       }
     ]
   },
   {
     "number":2,
     "timetable": [
       {
         "name":"Station1",
         "time":"2016-05-18T18:24:00.000Z"
       },
       {
         "name":"Station2",
         "time":"2016-05-18T18:28:00.000Z"
       }
     ]
   }
  ]

Так что мне нужно, чтобы просмотреть строки, где имя, например, Station2, и мне нужно их по порядку по времени. Строки не упорядочены ни по времени, ни по номеру. Количество строк расписания меняется, поэтому номера строк тоже не помогают. Можно ли заказать их внутри ng-repeat, в стиле "OrderBy time, где name='Station2' "?

РЕДАКТИРОВАТЬ: В настоящее время я показываю результаты без упорядочивания, только с фильтрацией. Текущий PHP:

<tr ng-repeat="x in rows | limitTo:5">
  <td>
    <a href="aikataulu.php?n={{x.number}}">
      <span class="label label-primary line-{{x.lineID}}">{{x.lineID}}</span> {{x.number}}
    </a>
  </td>
  <td>
    <span ng-repeat="y in x.timetable | limitTo:-1">{{y.name}}</span> //This is for showing the destination
  </td>
  <td>
    <span ng-repeat="y in x.timetable | filter:{'name':'<?php echo $as;?>'}: true | limitTo:1">{{y.time | date:'HH:mm'}}</span>
  </td>
</tr>

$ как станция, которая будет показана. Итак, теперь порядок списка идет прямо из порядка JSON, поэтому он сильно варьируется.

2 ответа

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

Таким образом, вы бы расширили свой код до:

<span ng-repeat="y in x.timetable | filter:{'name':'<?php echo $as;?>'}: true : myComparator | limitTo:1">{{y.time | date:'HH:mm'}}</span>

Вам нужно регулярное выражение, чтобы увидеть, являются ли сравниваемые строковые значения датами, и вы можете сделать что-то похожее на:

$scope.myComparator= function (a, b) {
            // regex to see if the compared values are dates
            var isDate = /(-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-)/g;

            // sorting dates
            if (isDate.test(a.value)) {
                var aDate = new Date(a.value), bDate = new Date(b.value);
                return aDate.getTime() < bDate.getTime() ? -1 : 1
            }

            // default sorting
            return a.index < b.index ? -1 : 1
        }

Стоит отметить, что вам понадобится другое регулярное выражение, чтобы найти формат даты. Что-то вроде следующего может быть достаточно:

/(\d{4})-(\d{2})-/g

ПРИМЕЧАНИЕ. Это непроверенный код, который служит лишь руководством к правильному подходу. Убедитесь, что ваша версия AngularJS поддерживает компаратор в качестве аргумента фильтра.

Вы можете упорядочить массив объектов по одному из их свойств с помощью функции фильтра, подобной этой:

angular.module('yourApp').filter('orderObjectBy', function() {
    return function(items, field, reverse) {
        var filtered = [];
        angular.forEach(items, function(item) {
            filtered.push(item);
        });
        filtered.sort(function (a, b) {
            return (a[field] > b[field] ? 1 : -1);
        });
        if(reverse) filtered.reverse();
            return filtered;
        };
    }
);

Используйте это так

<div ng-repeat="elem in data | orderObjectBy:'number'">
    // ...
</div>
Другие вопросы по тегам