С моим интерфейсом 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
JacobTStaggs 16 Апр 2019 в 18:40

2 ответа

Лучший ответ

Единственная проблема, которую я вижу, заключается в наборе вашего параметра sortByKeys в следующем

export function sortArrayByKey<T>(ordersArr: T[], sortByKeys: keyof T): T[] {
    return ordersArr.sort((a, b) => {
        return sortWithKey(a, b, sortByKeys, 0);
    });
}

Выше вы говорите, что sortByKeys должен иметь тип keyof T, но затем в вашем коде вы пытаетесь передать его 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 в первой функции и параметр keys во второй функции - ISortPriority [].

Думаю, это решит проблему.

0
ccamac 16 Апр 2019 в 16:37

Ваш второй параметр sortArrayByKey

sortByKeys: keyof T

Это означает, что это должен быть один из 4 ключей объектов, которые вы передаете в первом параметре: заголовок, имя, компания и возраст.

Я думаю, что вы просто неправильно ввели этот параметр, потому что вы передаете все ключи вместе с их приоритетом. Поэтому я думаю, что подпись sortArrayByKey должна быть такой:

function sortArrayByKey<T>(ordersArr: T[], sortByKeys: ISortPriority<T>[]): T[] 
0
Austin 16 Апр 2019 в 16:33