Elliot
Elliot

Reputation: 13845

using sort_by in ruby (for rails)?

So I've built a custom array of users like such:

[["user1",432],["user1",53],["user9",58],["user5",75],["user3",62]]

I want to sort them by the 2n'd value in each array, from largest to smallest. I have a feeling using sort or sort_by for arrays is the way to do this, but I'm not really sure how to accomplish it

Upvotes: 21

Views: 32534

Answers (3)

Victor Moroz
Victor Moroz

Reputation: 9225

One more solution to sort_by in reverse (- doesn't work in all cases, think sorting by string):

class Invertible
  include Comparable
  attr_reader :x

  def initialize(x)
    @x = x
  end

  def <=> (x)
    x.x <=> @x
  end
end

class Object
  def invertible
    Invertible.new(self)
  end
end

[1, 2, 3].sort_by(&:invertible) #=> [3, 2, 1]
["a", "b", "c"].sort_by(&:invertible) #=> ["c", "b", "a"]

It is slower than reverse in simple case, but may work better with complex sorts:

objs.sort_by do |obj|  
  [obj.name, obj.date.invertible, obj.score, ...]
end

Upvotes: 0

Jan
Jan

Reputation: 11726

sort_by

If you're interested in sort_by, you could destructure your inner arrays

array.sort_by { |_, x| x }.reverse

or call the index operator

array.sort_by { |x| x[1] }.reverse

Instead of reversing you could negate values returned from the block.

array.sort_by { |_, x| -x }
array.sort_by { |x| -x[1] }

Yet another alternative would be to use an ampersand and Array#last.

array.sort_by(&:last).reverse

sort

A solution using sort could be

array.sort { |x, y| y[1] <=> x[1] }

Upvotes: 46

Vasiliy Ermolovich
Vasiliy Ermolovich

Reputation: 24637

use this: array.sort_by { |a| -a[1] }

Upvotes: 2

Related Questions