Class: Ace::Support::Items::Molecules::ItemSorter

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/support/items/molecules/item_sorter.rb

Overview

Sorts collections of items by a field with configurable direction. Nil values sort last regardless of direction.

Class Method Summary collapse

Class Method Details

.sort(items, field:, direction: :asc, value_accessor: nil) ⇒ Array

Sort items by a field

Parameters:

  • items (Array)

    Items to sort

  • field (String, Symbol)

    Field name to sort by

  • direction (Symbol) (defaults to: :asc)

    :asc or :desc (default: :asc)

  • value_accessor (Proc, nil) (defaults to: nil)

    Custom accessor: ->(item, key) { value }

Returns:

  • (Array)

    Sorted items



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/ace/support/items/molecules/item_sorter.rb', line 16

def self.sort(items, field:, direction: :asc, value_accessor: nil)
  return [] if items.nil? || items.empty?

  accessor = value_accessor || method(:default_value_accessor)

  multiplier = (direction == :desc) ? -1 : 1

  items.sort do |a, b|
    val_a = accessor.call(a, field.to_s)
    val_b = accessor.call(b, field.to_s)

    # Nil values sort last regardless of direction
    if val_a.nil? && val_b.nil?
      0
    elsif val_a.nil?
      1
    elsif val_b.nil?
      -1
    else
      (val_a <=> val_b || 0) * multiplier
    end
  end
end