使用LoDash orderBy和动态值进行升序或降序排序



LoDashorderBy函数非常简单——您可以向它传递要排序的集合、要排序的属性,然后可以选择对这些属性的排序是升序还是降序。一个典型的用法可能是这样的:

let sortedCollection = _.orderBy(unsortedCollection, ['columnA', 'columnB'], ['asc', 'desc']);

我需要能够动态地设置要排序的属性,以及每个属性的排序应该是升序还是降序。我在动态设置要排序的属性时没有遇到任何问题,但我不知道如何动态设置升序/降序选项。我有一个具有nameorder属性的SortOrderItem对象。如果ordertrue,则该属性应按升序排序,否则按降序排序。

namespace app.models {
export class SortOrderItem {
name: string;
order: boolean;
}
}

我有一个在UI中设置的数组(存储在一个名为sortOrder的数组中(,当我想对我的集合进行排序时,我会在数组中循环以构建属性和(希望(排序顺序:

private getSortedRecords(unsortedCollection: any[]): any[] {
let sortColumns: string[] = [];
let sortOrders: string[] = [];
_.forEach(this.sortOrder,
(item: models.SortOrderItem) => {
sortColumns.push(item.name);
sortOrders.push(item.order ? 'asc' : 'desc');
});
return _.orderBy(unsortedCollection, sortColumns, sortOrders);
}

但是,这不起作用,因为它不喜欢第三个参数的字符串数组。我得到:

TS2769:(TS(没有与此调用匹配的过载。上一次过载导致以下错误。类型为"string[]"的参数不可分配给类型为"Many<boolean |"asc"|"desc">'。类型"string[]"不可分配给类型"readonly(boolean |"asc"|"desc"([]"。类型'string'不可赋值给类型'boolean |"asc"|"desc"'

所以我尝试使用readonly(boolean|'asc'|'desc')[]作为我的sortOrders变量的类型:

let sortOrders: readonly(boolean|'asc'|'desc')[] = [];

这不起作用,因为然后我得到这个错误:

TS2339:(TS(类型"readonly(boolean |"asc"|"desc"([]"上不存在属性"push">

如何设置此参数,以便动态定义最后一个参数?

定义SortOrder类型:

type SortOrder = 'asc' | 'desc';

并将其用作sortOrders:的类型

function getSortedRecords(unsortedCollection: any[]): any[] {
const sortColumns: string[] = [];
const sortOrders: SortOrder[] = [];
_.forEach(this.sortOrder,
(item: SortOrderItem) => {
sortColumns.push(item.name);
sortOrders.push(item.order ? 'asc' : 'desc');
});
return _.orderBy(unsortedCollection, sortColumns, sortOrders);
}

最新更新