Javascript Fast Sorting 2-мерный массив - PullRequest
0 голосов
/ 17 мая 2019

Итак, я пытаюсь реализовать своего рода представление таблицы данных в React Native. Все, что мне действительно нужно сделать, это отсортировать столбцы. Структура данных, которую я пытаюсь отсортировать, выглядит примерно так:

[
   [
     element,
     element,
     (9 elements per array)
   ],
   [
     element,
     element,
     (9 elements per array)
   ]
]

, где у меня есть в общей сложности 170+ массивов в базовом массиве, а каждый дочерний массив имеет 9 элементов.

Я смог выполнить сортировку, используя, по сути, этот метод:

return items.sort(function(a,b) {
   return a[col].value > b[col].value ? 1:-1
})

Проблема, с которой я сталкиваюсь, заключается в том, что сортировка занимает хорошую секунду или две. Я не замечаю этой задержки с таблицами веб-данных, поэтому мне интересно, есть ли какой-то алгоритм сортировки, который я должен использовать для более быстрой сортировки? Могу ли я по-разному структурировать свои данные (хотя у меня были похожие результаты при наличии массива объектов)?

Ответы [ 3 ]

1 голос
/ 17 мая 2019

Вы можете сократить свою функцию сортировки до

items.sort(function(a,b) {
   return a[col].value - b[col].value;
})

, но даже в этом случае вы, вероятно, не увидите значительных улучшений в скорости.Мемоизация может помочь при последующих вызовах, если вы не ожидаете, что ваши данные будут часто меняться.Все 170 элементов будут видны с одного экрана?Если нет, вы можете использовать ленивую загрузку (отсортируйте первые 30 элементов, отобразите результаты, а затем рассмотрите остальные данные).

1 голос
/ 17 мая 2019

Сортировка 170 элементов с использованием Javascript Array.prototype.sort () не должна занимать более нескольких мс, так что, вероятно, это проблема рендеринга.

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

0 голосов
/ 17 мая 2019

Вы можете исключить троичную операцию - просто используйте вычитание:

return a[col].value - b[col].value;

Если это строки, а не числа:

return a[col].value.localeCompare(b[col].value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...