关于sort排序规则,以及多次连续排序
// 这样排序函数调用 传入你需要比排序的字段名
xx.sort(this.compare(‘PeriodName’, ‘PeriodicalName’)
compare<T>(property: string, PeriodicalName: string): T {
const that = this;
// tslint:disable-next-line:only-arrow-functions
return function(a: any, b: any): number {
// 在第一条件排好序的基础下 第二条件开始排序
if (a[property] === b[property]) {
// @ts-ignore
if (that.filterArrayPrdcl(a.PeriodicalName,this. ArryPeriodical) > that.filterArrayPrdcl(b.PeriodicalName, this.ArryPeriodical)) {
return 1;
}
// @ts-ignore
else if (that.filterArrayPrdcl(a.PeriodicalName, ArryPeriodical) < that.filterArrayPrdcl(b.PeriodicalName, ArryPeriodical)) {
return -1;
} else {
return 0;
}
} else {
if (a[property] > b[property]) {
return -1;
} else {
return 1;
}
}
};
}
// 第二个要比较的字段,这里因为第二字段是另外的配置文件(ArryPeriodical是读的配置json)来使用的,可以为他配置默认排序的一个编号 如[{PeriodicalName:'xxxx',sort:1},...] 来对sort的判断使用 如图:1-1配置。
// *** 其实这里不该这样单个传入,再返回序号上面又做判断的,更好的就是直接上面 a,b参数当数组都传入,直接找到并比较后直接 给出排序
private filterArrayPrdcl(PeriodicalName: string, ArryPeriodical: Array<PrdclOptionItem>): number {
return ArryPeriodical.filter(item => {
// 传入的 PeriodicalName值对应配置文件的Name值
return item.Name === PeriodicalName;
})[0].sort;
}
图:1-1 ,配置文件作用:
- 一是做统一处理默认
- 二是这个排序允许页面上自己手动调整顺序,再根据sort来排序,
页面上的调动配置文件数据排序,数据交换以及sort顺序
if (typeName === 'sort') {
// 为价格库设置 排序方式
if (!typeOption) {
[OrigData[i].sort, OrigData[i - 1].sort] = [OrigData[i - 1].sort, OrigData[i].sort];
} else {
[OrigData[i].sort, OrigData[i + 1].sort] = [OrigData[i + 1].sort, OrigData[i].sort];
}
// 交换两条数据位置 typeOption( 0:下移,1:上移)控制上移还是下移
OrigData[i] = OrigData.splice(!typeOption ? i - 1 : i + 1, 1, OrigData[i])[0];
}
为此满足了在第一条件排好序后,再根据第二条件排序(允许第二条件变化顺序又再次排序)。达到最后结果数据。