如何用Ruby中的不同元素对混合数组进行排序?

sha*_*dar 3 ruby arrays sorting hash ruby-on-rails

我有一个类似于这样的数组:

a = [
  [0, {:a=>"31", :b=>"21"}],
  [1, {:a=>"32", :b=>"11"}],
  [1, {:a=>"25", :b=>"19"}],
  [0, {:a=>"12", :b=>"10"}]
]
Run Code Online (Sandbox Code Playgroud)

我希望按每行的第一个元素或散列的各个元素(行中的第二个元素)对其进行排序.

Til*_*ilo 7

按数组中的第一项排序:

> a.sort_by{|x| x.first}
 => [[0, {:a=>"31", :b=>"21"}], 
     [0, {:a=>"12", :b=>"10"}], 
     [1, {:a=>"32", :b=>"11"}], 
     [1, {:a=>"25", :b=>"19"}]] 
Run Code Online (Sandbox Code Playgroud)

按哈希中的第一项排序:

> a.sort_by{|x| x.last.first}
 => [[0, {:a=>"12", :b=>"10"}],
     [1, {:a=>"25", :b=>"19"}], 
     [0, {:a=>"31", :b=>"21"}], 
     [1, {:a=>"32", :b=>"11"}]] 
Run Code Online (Sandbox Code Playgroud)

或者您可以按散列的给定键进行排序:

> sort_key = :b
> a.sort_by{|x| x.last[ sort_key ]}
 => [[0, {:a=>"12", :b=>"10"}],
     [1, {:a=>"32", :b=>"11"}],
     [1, {:a=>"25", :b=>"19"}],
     [0, {:a=>"31", :b=>"21"}]] 
Run Code Online (Sandbox Code Playgroud)

如果要按第一个数组值排序,然后按哈希中的第一个条目排序,作为辅助搜索条件,答案是:

> a.sort_by{|x| [x.first, x.last.first]}
 => [[0, {:a=>"12", :b=>"10"}], 
     [0, {:a=>"31", :b=>"21"}], 
     [1, {:a=>"25", :b=>"19"}], 
     [1, {:a=>"32", :b=>"11"}]] 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,"哈希中的第一个条目"仅适用于Ruby 1.9.ruby 1.8中的哈希只有键,没有隐含的顺序. (2认同)