0

我有一个哈希,我想更改密钥顺序。

{"result"=>{"data"=>[{"Quantity"=>13, "Rate"=>17.1},
                    {"Quantity"=>29,"Rate"=>3.2}, 
                    {"Quantity"=>7, "Rate"=>3.4}]}}

到:

{"result"=>{"data"=>[{"Rate"=>17.1, "Quantity"=>13}, 
                    {"Rate"=>3.2, "Quantity"=>29}, 
                    {"Rate"=>3.4, "Quantity"=>7}]}}

可以通过hash["result"]["data"]. 我试过;

hash["result"]["data"][0].each_value{|v| v.replace({"Rate" => v.delete("Rate")}.merge(v))}

但它给出了错误:

NoMethodError(17.1:Float 的未定义方法“删除”):

4

3 回答 3

2

试试这个,

hash["result"]["data"].each{|v| v.replace({"Rate" => v.delete("Rate")}.merge(v))}
于 2017-12-29T09:30:40.393 回答
2

我认为他们没有必要做这么多的操作。我想data包含你的整个哈希然后只有一个映射和哈希的反向将解决你的问题。

data['result']['data'] = data['result']['data'].map{|v|  Hash[v.to_a.reverse]}
于 2017-12-29T09:40:36.127 回答
2

还有四种方法...

颠倒这些哈希项的顺序:

hash['result']['data'].map! { |h| h.to_a.reverse.to_h }

将“数量”移到末尾:

hash['result']['data'].each { |h| h["Quantity"] = h.delete("Quantity") }

将第一项移动到末尾:

hash['result']['data'].map! { |h| h.merge([h.shift].to_h) }

强制某个给定的顺序:

keys = ["Rate", "Quantity"]
hash['result']['data'].map! { |h| keys.zip(h.values_at(*keys)).to_h }
于 2017-12-29T15:58:46.047 回答