如何在ruby模板中输出排序哈希

我正在构建一个内联应用程序的配置文件。 它本质上是一个json文件。 我每次都以相同的方式输入puppet / ruby​​ 1.8,这很麻烦。

我正在使用

 

但是在输出人类可读内容时,每次都不能保证相同的顺序。 这意味着木偶会经常针对相同的数据发送更改通知。

我也试过了

  

每次都会生成相同的数据/顺序。 当数据具有嵌套数组时会出现问题。

 data => { beanstalkd => [ "server1", ] } 

 "beanstalkd": "server1", 

代替

 "beanstalkd": ["server1"], 

我现在已经开始和关闭这几天了,所以想要一些帮助

哈希是一种无序的数据结构。 在某些语言中(例如ruby),有一个有序的哈希版本,但在大多数情况下,在大多数语言中,你不应该依赖哈希中的任何特定顺序。

如果订单对您很重要,您应该使用数组。 所以,你的哈希

 {a: 1, b: 2} 

变成了这个

 [{a: 1}, {b: 2}] 

我认为,它不会对您的代码强制进行太多更改。

解决您的情况

试试这个:

 data = {beanstalkId: ['server1'], ccc: 2, aaa: 3} data2 = data.keys.sort.map {|k| [k, data[k]]} puts Hash[data2] #=> {:aaa=>3, :beanstalkId=>["server1"], :ccc=>2} 

由于Ruby 中的哈希有序的,并且问题用ruby标记,这里是一个递归排序哈希的方法(不影响数组的排序):

 def sort_hash(h) {}.tap do |h2| h.sort.each do |k,v| h2[k] = v.is_a?(Hash) ? sort_hash(v) : v end end end h = {a:9, d:[3,1,2], c:{b:17, a:42}, b:2 } p sort_hash(h) #=> {:a=>9, :b=>2, :c=>{:a=>42, :b=>17}, :d=>[3, 1, 2]} require 'json' puts sort_hash(h).to_json #=> {"a":9,"b":2,"c":{"a":42,"b":17},"d":[3,1,2]} 

请注意,如果您的哈希值具有无法比较的密钥,则会发生灾难性故障。 (如果您的数据来自JSON,则不会出现这种情况,因为所有键都是字符串。)