У меня была похожая проблема при отображении блоков пула памяти из вывода некоторой композиции виртуальных h-функций DOM. По сути, я столкнулся с той же проблемой, что и сортировка многокритериальных данных, таких как оценка результатов игроков со всего мира.
Я заметил, что многокритериальная сортировка:
- sort by the first column
- if equal, sort by the second
- if equal, sort by the third
- etc... nesting and nesting if-else
И если вам все равно, вы можете быстро потерпеть неудачу в адском гнусном пламени ... как в аду с обещаниями обратного вызова ...
Что если мы напишем функцию "предиката", чтобы решить, какую часть альтернативы использовать? Предикат просто:
// useful for chaining test
const decide = (test, other) => test === 0 ? other : test
Теперь, после написания ваших классификационных тестов (byCountrySize, byAge, byGameType, byScore, byLevel ...), кому бы вы ни понадобились, вы можете взвесить ваши тесты (1 = asc, -1 = desc, 0 = отключить), поставить их в массиве, и примените сокращающую функцию 'решить' следующим образом:
const multisort = (s1, s2) => {
const bcs = -1 * byCountrySize(s1, s2) // -1 = desc
const ba = 1 *byAge(s1, s2)
const bgt = 0 * byGameType(s1, s2) // 0 = doesn't matter
const bs = 1 * byScore(s1, s2)
const bl = -1 * byLevel(s1, s2) // -1 = desc
// ... other weights and criterias
// array order matters !
return [bcs, ba, bgt, bs, bl].reduce((acc, val) => decide(val, acc), 0)
}
// invoke [].sort with custom sort...
scores.sort(multisort)
И вуаля! Это зависит от вас, чтобы определить свои собственные критерии / веса / заказы ... но вы поняли идею. Надеюсь, это поможет!
EDIT:
* убедитесь, что в каждом столбце есть общий порядок сортировки
* помните о том, что нет зависимости между порядками столбцов и циклических зависимостей
если нет, сортировка может быть нестабильной!