如何在ruby 2.3.0中按哈希键的值对其进行排序



我有这个数组:

data = [
  ['Frank', 33],
  ['Stacy', 15],
  ['Juan', 24],
  ['Dom', 32],
  ['Steve', 24],
  ['Jill', 24]
]

我把它变成了一个散列,这样我就可以按照键和值来组织它,这样它们就更容易单独调用了。它最终给了我这个

{"Frank"=>33, "Stacy"=>15, "Juan"=>24, "Dom"=>32, "Steve"=>24, "Jill"=>24}

我知道为了只看到密钥,我需要执行data.keys,并且通过执行data.keys.sort,我可以按字母顺序获得密钥。

我假设我需要做一些类似data.keys.sort_by { |key, value| value }的事情,但无论何时运行,我都会按原始顺序接收散列键。

您不能更改哈希的顺序,但可以在将数组转换为哈希之前对其进行排序:

data = [
  ['Frank', 33],
  ['Stacy', 15],
  ['Juan', 24],
  ['Dom', 32],
  ['Steve', 24],
  ['Jill', 24]
]
hash = data.sort_by(&:last).to_h
# => { "Stacy" => 15,
#      "Juan" => 24,
#      "Steve" => 24,
#      "Jill" => 24,
#      "Dom" => 32,
#      "Frank" => 33 }

如果你已经有了一个散列,那么你必须把它变成一个数组,然后对它进行排序,然后再把它变成散列,例如hash.to_a.sort_by(&:last).to_h

此外,

如何在ruby 2.3.0中按哈希键的值对其进行排序?

如果你有像这样的散列

hash = {"Frank"=>33, "Stacy"=>15, "Juan"=>24, "Dom"=>32, "Steve"=>24, "Jill"=>24}

然后,散列可以简单地按keysvalues排序,但这会给你一个arrayarrays,它可以转换为散列。

hash.sort_by{|x,y| y}.to_h
# => {"Stacy"=>15, "Juan"=>24, "Steve"=>24, "Jill"=>24, "Dom"=>32, "Frank"=>33}

对于嵌套哈希

people = {
  :fred => { :name => "Fred", :age => 23 },
  :joan => { :name => "Joan", :age => 18 },
  :pete => { :name => "Pete", :age => 54 }
}
people.sort_by { |k, v| v[:age] }
# => [[:joan, {:name=>"Joan", :age=>18}],
#     [:fred, {:name=>"Fred", :age=>23}],
#     [:pete, {:name=>"Pete", :age=>54}]]

这样,如果我们选择的话,我们甚至可以按:name键进行排序。

最新更新