Определенный порядок по полю в ng-repeat

0

Я искал google и нашел много способов сортировки в ng-repeat, но я не нашел никакой информации для своей ситуации. У меня также нет кода для поставки, я не знаю, возможно ли это.

Это проблема. У меня есть массив Items и у всех Items есть group. Доступны группы ['rare', 'uncommon', 'common']. Теперь я использую ng-repeat, но они все разбросаны. Я хочу заказать их, сначала Rare, Uncommon second и Common как last. Во-вторых, все Items имеют price, и в каждой редкости я хочу, чтобы они также были заказаны по price.

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

В MySQL это может быть достигнуто путем:

SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple') DESC, price DESC;
Теги:
angularjs-ng-repeat

2 ответа

2
Лучший ответ

Прямо из официальной документации orderBy:

выражение

Предикат, который будет использоваться компаратором для определения порядка элементов.

Может быть одним из:

function: функция Getter. Результат этой функции будет отсортирован с помощью оператора <, ===,>.

string: [...]

Массив: массив предикатов функций или строк. Первый предикат в массиве используется для сортировки, но когда два элемента эквивалентны, используется следующий предикат.

(акцент мой)

Итак, вам сначала нужна функция, которая позволяет сравнивать ваши группы с "редким" первым, затем "необычным", а затем "общим":

var orderedGroups = ['rare', 'uncommon', 'common'];
$scope.groupComparator = function(item) {
    return orderedGroups.indexOf(item.group);
}

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

ng-repeat="item in items | orderBy:[groupComparator, 'price']"
  • 0
    Спасибо за ответ. Я посмотрел на документацию, но я все еще новичок в Angular, и не совсем понимаю, как сопоставить это вместе. Можно ли добавить небольшой пример кода? Я пробовал ng-repeat="item in Items | orderBy:[rarity:['rare', 'uncommon', 'common']]" , но это не так.
  • 0
    Я исправил свой ответ.
Показать ещё 2 комментария
0

Вы можете создать свой собственный фильтр следующим образом:

app.filter('sortByGroup&Price', function($filter) {
  return function(input) {
    var result = [];
    var rare = $filter('filter')(input, {group: 'rare'});
    result.push($filter('orderBy')(rare,'price');
    var uncommon = $filter('filter')(input, {group: 'uncommon'});
    result.push($filter('orderBy')(uncommon,'price');
    var common = $filter('filter')(input, {group: 'common'});
    result.push($filter('orderBy')(common,'price');
    return result;
  };
});

ng-repeat="item in Items | sortByGroup&Price "

Ещё вопросы

Сообщество Overcoder
Наверх
Меню