使用接口ISortPriority尝试分配键以匹配该接口,然后基于该接口对数组进行排序。我的排序算法有效,我在使用界面时遇到问题。
这是我正在运行的测试:
it('Should sort with multiple keys - Numbers', () => {
const arr = [{name: 'j company', title: 'Software Eng 1', age: 23,company: 'test'}, {name: 'f company', age: 21, title: 'Software Eng 7', company: 'abc'},{name: 'g company', title: 'Software Eng 2', age: 22, company: 'test'}, {name: 't company', age: 24, title: 'Software Eng 3', company: 'test'}];
const keys: ISortPriority<any>[] = [{sortKey: 'age', priority: 1}, {sortKey: 'company', priority: 3}, {sortKey: 'name', priority: 4}, {sortKey: 'title', priority: 5}];
expect(sortArrayByKey(arr, keys)).toEqual([{name: 'f company', age: 21, title: 'Software Eng 7', company: 'abc'}, {name: 'g company', age: 22, title: 'Software Eng 2', company: 'test'}, {name: 'j company', age: 23, title: 'Software Eng 1', company: 'test'}, {name: 't company', age: 24, title: 'Software Eng 3', company: 'test'}]);
});
但是当我打电话:
expect(sortArrayByKey(arr, keys))
这是在说:“'ISortPriority []'类型的参数不能分配给''title'|“ name” |“ company” |“ age”'类型的参数。”悬停在“键”参数上方
最后,这是我正在使用的排序方法和接口:
export function sortArrayByKey<T>(ordersArr: T[], sortByKeys: keyof T): T[] {
return ordersArr.sort((a, b) => {
return sortWithKey(a, b, sortByKeys, 0);
});
}
function sortWithKey<T>(a: T, b: T, keys, index: number) {
index = index || 0;
keys = keys.sort((c, d) => (c.priority > d.priority) ? 1 : -1);
const currKey = keys[index].sortKey;
return a[currKey] > b[currKey] ? 1 : (a[currKey] < b[currKey] ? -1 :
sortWithKey(a, b, keys, index + 1));
}
export interface ISortPriority<T> {
priority: number;
sortKey: keyof T;
}
答案 0 :(得分:0)
您的sortArrayByKey的第二个参数是
result = [str(b[int(i / len(c)) % len(b)]) + str(c[i % len(c)]) for i in range(len(a))]
这意味着它必须是您要在第一个参数中传递的对象的4个键之一,这些键是:标题,名称,公司和年龄。
我认为您输入的参数不正确,因为您要传递所有键及其优先级。因此,我认为sortArrayByKey的签名应如下所示:
sortByKeys: keyof T
答案 1 :(得分:0)
我看到的唯一问题是在下面键入参数sortByKeys
export function sortArrayByKey<T>(ordersArr: T[], sortByKeys: keyof T): T[] {
return ordersArr.sort((a, b) => {
return sortWithKey(a, b, sortByKeys, 0);
});
}
在上面您说sortByKeys必须是T的key类型,但是然后在您的代码中尝试将其传递给ISortPriority []。
以下是我认为您应该进行的更改才能使此功能正常工作
export function sortArrayByKey<T>(ordersArr: T[], sortByKeys: ISortPriority<T>[]): T[] {
return ordersArr.sort((a, b) => {
return sortWithKey(a, b, sortByKeys, 0);
});
}
function sortWithKey<T>(a: T, b: T, keys: ISortPriority<T>[], index: number) {
index = index || 0;
keys = keys.sort((c, d) => (c.priority > d.priority) ? 1 : -1);
const currKey = keys[index].sortKey;
return a[currKey] > b[currKey] ? 1 : (a[currKey] < b[currKey] ? -1 :
sortWithKey(a, b, keys, index + 1));
}
唯一的变化是,我在第一个函数中键入了sortByKeys参数,在第二个函数中键入了key参数,均为ISortPriority []。
我认为这可以解决问题。