我搜索了谷歌,并找到了很多方法在ng-repeat
排序,但我没有找到任何有关我的情况的信息。我也没有代码供应,我真的不知道是否可能。
这就是问题所在。我有一个Items
数组,所有Items
都有一个group
。可用的组是['rare', 'uncommon', 'common']
。现在我使用ng-repeat
,但它们都散开了。我想订购它们,稀有第一,罕见第二,共同为最后。 其次所有Items
都有price
,并且在每个稀有内容中,我希望它们也可以price
订购。
现在在这个例子中,我可以按group
desc字母顺序排序,但在我的其他情况下,这不起作用。我真的在寻找一种按字符串排序的方法。
在MySQL中,这可以通过以下方式实现:
SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple') DESC, price DESC;
答案 0 :(得分:2)
直接来自official documentation of orderBy:
表达
比较器用来确定元素顺序的谓词。
可以是以下之一:
功能:Getter功能。 此功能的结果将使用<,===,>进行排序。操作强>
string:[...]
Array:函数或字符串谓词的数组。 数组中的第一个谓词用于排序,但当两个项相同时,使用下一个谓词。
(强调我的)
因此,您首先需要一个能够比较您的群组的功能,以及罕见的群组。先行,然后“罕见”,然后“常见”':
var orderedGroups = ['rare', 'uncommon', 'common'];
$scope.groupComparator = function(item) {
return orderedGroups.indexOf(item.group);
}
您不需要任何价格,因为它是该项目的一个字段,而orderBy可以简单地取字段名称。所以你现在可以做到
ng-repeat="item in items | orderBy:[groupComparator, 'price']"
答案 1 :(得分: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 "