多功能angularjs orderBy,如何反转?

多功能angularjs orderBy,如何反转?,angularjs,Angularjs,我在一组对象上有一个ng repeat,它需要一些函数来提取我想要排序的值 我的ng repeat如下所示: ng-repeat="row in rows | orderBy: [sortFnOne, sortFnTwo, ...]" 我现在遇到的问题是,我想把Sortfone的名字改过来。这些是提取字符串,我无法使用简单属性访问这些字符串,因为它正在对数据进行一些转换,以生成我试图排序的这些值 如果很简单,我知道我会: ng-repeat="row in rows | orderBy: ['

我在一组对象上有一个ng repeat,它需要一些函数来提取我想要排序的值

我的ng repeat如下所示:

ng-repeat="row in rows | orderBy: [sortFnOne, sortFnTwo, ...]"
我现在遇到的问题是,我想把Sortfone的名字改过来。这些是提取字符串,我无法使用简单属性访问这些字符串,因为它正在对数据进行一些转换,以生成我试图排序的这些值

如果很简单,我知道我会:

ng-repeat="row in rows | orderBy: ['-id', 'name', '-status', ...]"

如果这些函数只是返回布尔值,我就可以!获取我想要的结果的返回值,但其中一些是返回字符串,一些是以YYYY-MM-DD格式返回日期。

我自己也遇到了这个限制。。。使用
orderBy
过滤器无法反转函数完成的排序

据我所知,在本机JavaScript API中,没有简单的方法可以复制这种带方向的复合排序(先按“A”升序,然后按“B”降序)

Array.prototype.sort
通过比较函数提供基本排序(有关详细信息,请参阅),但如果不编写另一个比较函数,就无法轻松切换排序顺序(反向),而且它也无法提供复合排序的解决方案。我们需要的是一个紧凑的符号来指定多重排序的方向和优先级

不久前我写了这个助手来帮助解决这个问题

  var orderByAgeThenName = new OrderByBuilder().asc(getAge).asc(getName).build();
  var friendsByAgeThenName = orderByAgeThenName(friends);

  var orderByNameThenAge = new OrderByBuilder().desc(getName).asc(getAge).build();
  var friendsByNameThenAge = orderByNameThenAge(friends);
这不是角度过滤器,所以只需将其包装在控制器方法中,并从模板中调用它。或者,只需将顺序应用于控制器内的阵列

我想这可能适用于角度滤波器

可运行样本:

angular.module('orderByExample',[])
.controller('ExampleController',['$scope',function$scope){
var朋友=
[{姓名:'Jon',电话:'555-1212',年龄:10},
{姓名:'Zach',电话:'555-2276',年龄:7},
{姓名:'Zach',电话:'555-9876',年龄:19},
{姓名:'Zach',电话:'555-9276',年龄:13},
{姓名:'Mike',电话:'555-4321',年龄:21},
{姓名:'Adam',电话:'555-5678',年龄:35},
{姓名:'Julie',电话:'555-8765',年龄:29}];
函数getName(f){
返回f.name;
}
函数getAge(f){
返回f.age;
}
var orderByName=new OrderByBuilder().desc(getName.build();
var orderByNameAndAge=new OrderByBuilder().desc(getName).asc(getAge.build();
$scope.friendLists=[
{标签:'未订购',朋友:朋友},
{label:'Name DESC',friends:orderByName(friends)},
{label:'Name DESC,Age ASC',friends:orderByNameAndAge(friends)}
];
}]);
函数OrderByBuilder(orderings){
var_排序=[];
返回{
asc:功能(fn){
addOrdering(真,fn);
归还这个;
},
描述:功能(fn){
addOrdering(假,fn);
归还这个;
},
建造:建造
};
功能添加顺序(asc、fn){
_订单推送({
getterFn:fn,
asc:asc
});
归还这个;
}
函数构建(){
var compare=\u orderings.reverse().reduce(函数(nextComparer,ordering){
返回getComparerFn(订购,下一个比较程序);
},空);
返回函数(xs){
返回xs.slice().sort(比较);
};
}
//comparerFn具有以下签名:
//函数(a:obj,b:obj):int
函数getComparerFn(排序,下一个比较程序){
var next=nextComparer | |函数(a,b){返回0;};
var getVal=ordering.getterFn;
返回函数(a,b){
var-aVal=getVal(a);
var bVal=getVal(b);
if(aValbVal){return ordering.asc?1:-1;}
返回下一个(a,b);
};
}
}

{{friendList.label}
名称
电话号码
年龄
{{friend.name}
{{朋友.电话}
{{friend.age}

Angular允许您提供一个比较器函数作为orderBy的第三个参数。此比较器功能使您能够指定自己的顺序

下面是一个演示动态复杂排序的示例。它从一个JSON文件中加载100条记录,最初先按姓氏排序,然后按名字排序。当您按姓氏以外的其他名称排序时,它使用姓氏和名字来打破关系。但是,虽然主字段上的排序顺序可以颠倒,但演示的示例仍将按升序对姓和名进行排序

$scope.compareData=函数(左、右){
函数比较值(valueLeft、valueRight){
风险价值回报;
如果(!isNaN(parseInt(valueLeft))和&!isNaN(parseInt(valueRight))){
价值回报=
((valueLeft*1)<(valueRight*1)
? -1
:((valueLeft*1)>(valueRight*1)?1:0);
}否则{
valueReturn=valueLeft.toString().localeCompare(valueRight.toString());
}
返回值返回;
}
var-dataReturn=0;
if(typeof right==“未定义”){
dataReturn=1;
}else if(typeof left==“未定义”){
dataReturn=-1;
}否则{
var valuesLeft=left.value.split(“,”);
var valuesRight=right.value.split(“,”);
对于(变量i=0;(i0))?-1:1;
}
}
返回数据返回;
}

以上是链接Plunk中比较器使用的函数。最后请注意,对字段进行反向排序就像将结果乘以-1一样简单。

您是否考虑过简单地编写一个自定义过滤器?在您的情况下,提供的
orderBy
标志(即第二个参数)仅适用于整个数组,这是一个遗憾。关于过滤器,我支持第二个@miqid。你可以