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

Gav*_*gan 7 ruby puppet

我正在构建一个内联应用程序的配置文件.它本质上是一个json文件.我在使用puppet/ruby​​ 1.8以每次输出hash/json时都遇到了很多麻烦.

我正在使用

<%= require "json"; JSON.pretty_generate data %>
Run Code Online (Sandbox Code Playgroud)

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

我也试过了

<%= require "json"; JSON.pretty_generate Hash[*data.sort.flatten] %>
Run Code Online (Sandbox Code Playgroud)

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

data => { beanstalkd => [ "server1", ] }
Run Code Online (Sandbox Code Playgroud)

"beanstalkd": "server1",
Run Code Online (Sandbox Code Playgroud)

代替

"beanstalkd": ["server1"],
Run Code Online (Sandbox Code Playgroud)

我现在已经和它一起打了几天,所以想要一些帮助

Ser*_*sev 0

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

如果顺序对您很重要,则应该使用数组。所以,你的哈希值

{a: 1, b: 2}
Run Code Online (Sandbox Code Playgroud)

变成这个

[{a: 1}, {b: 2}]
Run Code Online (Sandbox Code Playgroud)

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

针对您的情况的解决方法

尝试这个:

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}
Run Code Online (Sandbox Code Playgroud)