Я искал 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;
Прямо из официальной документации 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']"
Вы можете создать свой собственный фильтр следующим образом:
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 "
ng-repeat="item in Items | orderBy:[rarity:['rare', 'uncommon', 'common']]"
, но это не так.