ng-repeat中的特定ORDER BY FIELD

时间:2015-08-23 14:27:38

标签: angularjs angularjs-ng-repeat

我搜索了谷歌,并找到了很多方法在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;

2 个答案:

答案 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 "