У меня многомерный массив. Первичный массив - это массив
[publicationID][publication_name][ownderID][owner_name]
Я пытаюсь отсортировать массив owner_name
постепенно publication_name
. Я знаю, что у вас есть JavaScript Array.sort()
, в который вы можете поместить пользовательскую функцию, в моем случае у меня есть:
function mysortfunction(a, b) {
var x = a[3].toLowerCase();
var y = b[3].toLowerCase();
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
Это нормально для просто сортировка по одной колонке, а именно owner_name, но как я могу изменить его для сортировки owner_name
, а затем publication_name
?
javascript
algorithm
sorting
flavour404
источник
источник
[[A, 10], [J, 15], [A, 5], [J, 5]] => [[A, 10], [A, 5], [J, 15], [J, 5]]
Я думаю, что то, что вы ищете, это By.js: https://github.com/Teun/thenBy.js
Он позволяет использовать стандартный Array.sort, но со
firstBy().thenBy().thenBy()
стилем.Пример можно увидеть здесь .
источник
thenBy
вызове все элементы массива снова проходят цикл.Хороший способ сортировки по многим полям, которые являются строками, - использовать
toLocaleCompare
логический оператор||
.Что-то вроде:
Если вы хотите отсортировать по большему количеству полей, вы можете просто связать их с оператором return с большим количеством логических операторов.
источник
.reduce()
.localCompare()
возвращает -1, 0, 1, поэтому я не думаю, что ваше решение будет работать как || подходит для логических значенийsortItems = (a, b) => (a.distance - b.distance) || (a.name - b.name);
и это работает как шарм для моих непривередливых потребностей.(a.name - b.name)
необходимости. Создание переменных вначале выполняет дополнительную работу, даже если она не нужна.Возникла необходимость выполнить сортировку по ключам смешанных массивов объектов asc и desc в стиле SQL.
Решение kennebec, приведенное выше, помогло мне добраться до этого:
образец использования:
дает следующее:
(используя функцию печати отсюда )
вот пример jsbin .
редактировать: очищено и опубликовано как mksort.js на github .
источник
Это удобно для альфа-версий любого размера. Передайте ему индексы, по которым вы хотите отсортировать, в качестве аргументов.
источник
Я предлагаю использовать встроенный компаратор и связать желаемый порядок сортировки с помощью логического или
||
.Рабочий пример:
источник
Вы можете объединить две переменные в ключ сортировки и использовать его для сравнения.
источник
Нашел мультисотр . Это простая, мощная и небольшая библиотека для множественной сортировки. Мне нужно было отсортировать массив объектов по критериям динамической сортировки:
Эта библиотека более мощная, это был мой случай. Попытайся.
источник
Я работал
ng-grid
и нуждался в сортировке по множеству столбцов в массиве записей, возвращаемых из API, поэтому я придумал эту изящную динамическую функцию множественной сортировки.Прежде всего,
ng-grid
запускает «событие» для «ngGridSorted» и передает эту структуру обратно, описывая сортировку:Итак, я создал функцию, которая будет динамически генерировать функцию сортировки на основе
sortData
показанного выше ( не пугайтесь полосы прокрутки! Она всего около 50 строк! Кроме того, я сожалею о промахах. Это предотвратило горизонтальное полоса прокрутки! ):Затем я сортирую результаты своего API (
results
) следующим образом:Я надеюсь, что кому-то еще понравится это решение так же, как и мне! Спасибо!
источник
Попробуй это:
Показать фрагмент кода
Я предполагаю, что ваши данные в массиве,
let t = [ [publicationID, publication_name, ownderID, owner_name ], ... ]
где индекс owner_name = 3 и Public_name = 1.источник
Метод добавления строки
Вы можете сортировать по нескольким значениям, просто добавляя значения в строку и сравнивая строки. Полезно добавить символ разделенной клавиши, чтобы предотвратить переход от одной клавиши к другой.
пример
источник
источник
У меня была аналогичная проблема при отображении блоков пула памяти из вывода некоторой композиции h-функций виртуальной DOM. В основном я столкнулся с той же проблемой, что и сортировка данных по нескольким критериям, например, оценка результатов игроков со всего мира.
Я заметил, что сортировка по нескольким критериям:
И если вам все равно, вы можете быстро потерпеть неудачу в аду вложенности if-else ... как ад обратных вызовов ...
Что насчет того, если мы напишем «предикатную» функцию, чтобы решить, какую часть альтернативы использовать? Предикат прост:
Теперь, после написания ваших классификационных тестов (byCountrySize, byAge, byGameType, byScore, byLevel ...) независимо от того, кому нужно, вы можете взвесить свои тесты (1 = asc, -1 = desc, 0 = disable), поместить их в массив и примените уменьшающую функцию «решить», например:
И вуаля! Вы должны определить свои собственные критерии / вес / порядок ... но вы поняли идею. Надеюсь это поможет !
РЕДАКТИРОВАТЬ: * убедитесь, что для каждого столбца существует общий порядок сортировки * помните об отсутствии зависимостей между порядками столбцов и циклических зависимостей
если нет, то сортировка может быть нестабильной!
источник
Моя собственная библиотека для работы с итерациями ES6 (blinq) позволяет (среди прочего) легко выполнять многоуровневую сортировку
источник
Источник с GitHub
источник
Я только что опубликовал в npm микробиблиотеку под названием sort-helper ( источник на github ) . Идея состоит в том, чтобы импортировать помощник
by
для создания функции сравнения дляsort
метода массива с помощью синтаксисаitems.sort(by(column, ...otherColumns))
, с несколькими способами выразить столбцы для сортировки:persons.sort(by('lastName', 'firstName'))
,dates.sort(by(x => x.toISOString()))
,[3, 2, 4, 1].sort(by(desc(n => n)))
→[3, 2, 1, 0]
,['B', 'D', 'c', 'a'].sort(by(ignoreCase(x => x))).join('')
→'aBcD'
.Он похож на nice thenBy, упомянутый в этом ответе, но со следующими отличиями, которые могут прийтись по вкусу некоторым:
thenBy
Fluent API) ,источник