Как реализовать групповую сортировку по javascript? - PullRequest
0 голосов
/ 10 сентября 2018

Я хотел бы реализовать функцию сортировки для массива команд, где команды должны быть отсортированы по подстроке имени команды, а затем отсортированы по группам.Например, массив может выглядеть следующим образом:

["Project Team This", "Support Team Other", Project Team Another", "Project Directors", "Support Directors", "Project Team Other", "Support Team That"]

Я бы хотел отсортировать их там, где группы «Директора» находятся первыми, группы «Проект» - вторыми, а группы «Поддержка» - третьими, но затемможет быть отсортировано по алфавиту в этих группах.Кроме того, я бы сначала хотел, чтобы директора проектов, так что результат будет:

Project Directors,
Support Directors,
Project Team Another,
Project Team Other,
Project Team This,
Support Team Other,
Support Team That,

По сути, порядок:

  1. Директора проектов
  2. Все, что угодноеще с " директорами " в нем
  3. Что-нибудь с " проектом в нем
  4. Что-нибудь с" поддержкой"в нем

Я думал, что какой-то вид вставки мог бы пойти? Как бы вы это реализовали?

Любые предложения, которые вы высоко оценили.

Большое спасибо.

Обновление 1: Я попробовал функцию сравнения для стандартной сортировки следующим образом. Я думаю, что мне, вероятно, нужно сначала разбить их на отдельные группы, чтобы отсортировать их в алфавитном порядке, как предлагаетАдам.

function teamSort(a, b) {
    left = a.toLowerCase();
    right = b.toLowerCase();
    if (left.includes('project directors')) {
        return -1;
    }
    if (right.includes('project directors')) {
        return 1;
    }
    if (left.includes('project team')) {
        return -1;
    }
    if (right.includes('project team')) {
        return 1;
    }
    return 0;
}

Обновление 2 : По предложению Адама, на этот раз они разбиваются на отдельные массивы, сортируются и затем объединяются.

function teamSort2(teams) {
    let supportTeams = teams.filter(t => {
        return t.toLowerCase().includes('support');
    });
    let projectTeams = teams.filter(t => {
        return t.toLowerCase().includes('project team');
    });
    let projectDirectors = teams.filter(t => {
        return t.toLowerCase().includes('project directors');
    });
    let otherDirectors = teams.filter(t => {
        return t.toLowerCase().includes('directors') && !t.toLowerCase().includes('project directors');
    });

    supportTeams.sort();
    projectTeams.sort();
    otherDirectors.sort();

    return projectDirectors.concat(otherDirectors, projectTeams, supportTeams);
}

Лучшеспособы сделать это?

1 Ответ

0 голосов
/ 10 сентября 2018

Вы почти наверняка не должны беспокоиться о (или реализации) определенных алгоритмах сортировки. Функция Array.sort может принимать в качестве аргумента compareFunction, который определяет порядок списка; просто используйте это.

(Конечно, вам придется кодировать логику упорядочения, которую вы описали, но вы все равно должны были это сделать. Таким образом, это в основном все , что вам нужно сделать.)

...