Skip to content

Instantly share code, notes, and snippets.

@blrobin2
Created August 11, 2020 14:33
Show Gist options
  • Save blrobin2/cb4b8449e42c52905038ad767e59d71a to your computer and use it in GitHub Desktop.
Save blrobin2/cb4b8449e42c52905038ad767e59d71a to your computer and use it in GitHub Desktop.
How to do combination ASC, DESC sorting in Ruby
collection = [
{
'contract_number' => '123456',
'contract_level' => 1,
'contact_name' => 'craig'
}, {
'contract_number' => '654321',
'contract_level' => 2,
'contact_name' => 'david'
}, {
'contract_number' => '564321',
'contract_level' => 1,
'contact_name' => 'david'
}
]
sort_parts = [
{ 'colId' => 'contact_name', 'sort' => 'asc' },
{ 'colId' => 'contract_level', 'sort' => 'desc' }
]
asc_columns, desc_columns = sort_parts.partition { |part| part['sort'] == 'asc' }
asc_columns = asc_columns.map { |part| part['colId'] }
desc_columns = desc_columns.map { |part| part['colId'] }
sorted_results = collection.sort do |a, b|
left_side = []
right_side = []
unless asc_columns.empty?
left_side.push(*asc_columns.map { |col| a[col] })
right_side.push(*asc_columns.map { |col| b[col] })
end
unless desc_columns.empty?
# Notice switch between `right_side` and `left_side`, but keeping `a` and `b`
right_side.push(*desc_columns.map { |col| a[col] })
left_side.push(*desc_columns.map { |col| b[col] })
end
left_side <=> right_side
end
puts sorted_results.inspect
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment