Reputation: 13845
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
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
Reputation: 11726
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
A solution using sort
could be
array.sort { |x, y| y[1] <=> x[1] }
Upvotes: 46