пользовательская сортировка в Ag-сетке

Ниже приведен заголовок ag-сетки, примененной с настраиваемой сортировкой.

{
        headerName: "StudentId",
        field: "StudentId",
        width: 140,
        editable: false,
        enableRowGroup: true,
        comparator: (valA, valB, n1, n2, inverse) => {
          return valA.localeCompare(valB);

        },
        sortingOrder: ['desc', 'asc'] 
   }

Причина, по которой я добавил собственный компаратор, потому что данные похожи на

   S19
   S129
   S176
   S99
   S433
   S10

и после применения сортировки к указанному заголовку вы получите результат в столбце, подобном этому

   S10
   S129
   S176
   S19
   S433
   S99

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

Но мне нужен такой результат, потому что это быстро читаемый формат.

S10
S19
S99
S129
S176
S433

Можно ли сделать ??


person ResolveError    schedule 15.05.2020    source источник


Ответы (1)


Это не вопрос angular / ag-grid, поскольку это вопрос разработки алгоритма для желаемого поведения сортировки. Кажется, вы все разобрались, кроме функции comparator.

Но нам нужны более подробные сведения. Из вашего небольшого примера похоже, что ваш алгоритм может просто отрезать первый символ каждой строки и просто отсортировать по оставшимся числам. Но каких еще струн вы будете ожидать? В каждой строке всегда будет буква «S», за которой следует цифра? Если это так, то то, что я только что описал, будет работать.

Но если в каждой строке будет x символов, за которыми следует y цифр, вам нужно будет разделить ваши строки на две части (символы и цифры). Затем отсортируйте сначала по символам, а затем по цифрам.

Изменить: Op указал, что строка всегда представляет собой букву «S», за которой следуют цифры, поэтому я пишу здесь пользовательскую функцию компаратора.

    comparator: (valA, valB, n1, n2, inverse) => {
      const digitsA = parseInt(valA.substring(1));
      const digitsB = parseInt(valB.substring(1));
      return digitsA - digitsB;
    }

В основном это извлекает цифры из каждой строки, преобразует их в числа и просто возвращает разницу. Обратите внимание: если возвращаемое значение меньше 0, это означает, что A стоит перед B в списке.

person kebab-case    schedule 15.05.2020
comment
да. строка всегда "S", за которой следует цифра ... не могли бы вы объяснить мне логику? .Как я могу разделить S, а затем как использовать компаратор? - person ResolveError; 15.05.2020