根据数组中相同键的顺序对哈希键进行排序

时间:2016-03-30 07:15:07

标签: ruby

我需要根据其他数组中存在的键的顺序对哈希进行排序:

hash = { a: 23, b: 12 }
array = [:b, :a]
required_hash #=> { b: 12, a: 23 } 

有没有办法单行呢?

4 个答案:

答案 0 :(得分:7)

hash = { a: 23, b: 12 }
array = [:b, :a]

array.zip(hash.values_at(*array)).to_h
  #=> {:b=>12, :a=>23}

步骤:

v = hash.values_at(*array)
  #=> [12, 23]
a = array.zip(v) 
  #=> [[:b, 12], [[:a, 23]]
a.to_h
  #=> {:b=>12, :a=>23}

答案 1 :(得分:4)

您可以尝试这样的事情:

cross_image

答案 2 :(得分:2)

如果

hash = { a:23, b:12 }
array = [:b, :a]

作为一个班轮:

Hash[array.map{|e| [e, hash[e]]}]

至于排序,这是前段时间,当ruby改变了根据插入顺序排序哈希键的实现。 (在此之前,无法保证密钥会以某种方式排序)。

答案 3 :(得分:1)

我没有看到任何排序,我认为你基本上是这样做的:

hash = { a:23, b:12 }
array = [:b, :a]
res = {}
array.each { |key| res[key] = hash[key] } && res # `&& res` is just syntax sugar to return result in single line
#=> {:b=>12, :a=>23}