Так как хэши в 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, это не так, поскольку все ключи будут строками.)