gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:29 24 4
gpt4 key购买 nike

我正在为我们的一个内联应用构建一个配置文件。它本质上是一个 json 文件。我在让 puppet/ruby 1.8 每次都以相同的方式输出哈希/json 时遇到了很多麻烦。

我正在使用

<%= require "json"; JSON.pretty_generate data %>

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

我也试过

<%= require "json"; JSON.pretty_generate Hash[*data.sort.flatten] %>

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

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

成为

"beanstalkd": "server1",

代替

"beanstalkd": ["server1"],

我断断续续与这个问题斗争了几天,所以需要一些帮助

最佳答案

由于 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,则情况并非如此,因为所有键都是字符串。)

关于ruby - 如何在 ruby​​ 模板中输出排序哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9733764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com