Ruby on rails 根据预定义的键对ruby哈希进行排序

Ruby on rails 根据预定义的键对ruby哈希进行排序,ruby-on-rails,ruby,arrays,data-structures,hash,Ruby On Rails,Ruby,Arrays,Data Structures,Hash,我想对我的ruby哈希进行排序。我的数据如下 {"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"} {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"} 我想用下面的方法来准备 {"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"} {"imp

我想对我的ruby哈希进行排序。我的数据如下

{"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"}
{"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
我想用下面的方法来准备

{"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"}
{"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}

最简单的方法是什么?

这里有两种方法

h = {"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"}

key_order = ["imp", "vis", "ctr", "ins"]
#1

Hash[key_order.map { |k| [k, h[k]] }] 
  #=> {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
或者使用Ruby 2.1

key_order.map { |k| [k, h[k]] }.to_h
#2

Hash[key_order.zip(h.values_at(*key_order))]
  #=> {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
以下是步骤:

a = h.values_at(*key_order)
  #=> h.values_at(*["imp", "vis", "ctr", "ins"])
  #=> h.values_at("imp", "vis", "ctr", "ins")
  #=> ["116", "44", "0.08", "7.8"]

b = key_order.zip(a)
  #=> ["imp", "vis", "ctr", "ins"].zip(["116", "44", "0.08", "7.8"])
  #=> [["imp", "116"], ["vis", "44"], ["ctr", "0.08"], ["ins", "7.8"]]

Hash[b]
  #=> {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}

这里有两种方法

h = {"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"}

key_order = ["imp", "vis", "ctr", "ins"]
#1

Hash[key_order.map { |k| [k, h[k]] }] 
  #=> {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
或者使用Ruby 2.1

key_order.map { |k| [k, h[k]] }.to_h
#2

Hash[key_order.zip(h.values_at(*key_order))]
  #=> {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}
以下是步骤:

a = h.values_at(*key_order)
  #=> h.values_at(*["imp", "vis", "ctr", "ins"])
  #=> h.values_at("imp", "vis", "ctr", "ins")
  #=> ["116", "44", "0.08", "7.8"]

b = key_order.zip(a)
  #=> ["imp", "vis", "ctr", "ins"].zip(["116", "44", "0.08", "7.8"])
  #=> [["imp", "116"], ["vis", "44"], ["ctr", "0.08"], ["ins", "7.8"]]

Hash[b]
  #=> {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}

将密钥映射到订单可能是一个解决方案:

predefined_orders = ["imp", "vis", "ctr", "ins"]
orders = Hash[predefined_orders.each_with_index.to_a]
# => {"imp"=>0, "vis"=>1, "ctr"=>2, "ins"=>3}

h = {"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"}
Hash[h.sort_by { |x| orders[x[0]] }]
# => {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}

h.sort_by { |x| orders[x[0]] }.to_h  # Ruby 2.1+
# => {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}


将密钥映射到订单可能是一个解决方案:

predefined_orders = ["imp", "vis", "ctr", "ins"]
orders = Hash[predefined_orders.each_with_index.to_a]
# => {"imp"=>0, "vis"=>1, "ctr"=>2, "ins"=>3}

h = {"imp"=>"116", "ctr"=>"0.08", "ins"=>"7.8", "vis"=>"44"}
Hash[h.sort_by { |x| orders[x[0]] }]
# => {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}

h.sort_by { |x| orders[x[0]] }.to_h  # Ruby 2.1+
# => {"imp"=>"116", "vis"=>"44", "ctr"=>"0.08", "ins"=>"7.8"}


我不明白。。您想如何对asc desc进行排序?您能解释一下排序吗?你想要一个密钥顺序很重要的散列吗?不是升序,不是降序,我想要它按照我上面提到的方式对它们进行排序。有什么办法可以做到吗?我不明白。。您想如何对asc desc进行排序?您能解释一下排序吗?你想要一个密钥顺序很重要的散列吗?不是升序,不是降序,我想要它按照我上面提到的方式对它们进行排序。有没有办法做到这一点?