我有一个嵌套的JSONB散列,需要按日期顺序显示。
散列的存储方式如下:
hash =
{"residential_la"=>
{"current"=>{"periods"=>{"1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0", "7/2023"=>"0", "8/2023"=>"0", "9/2023"=>"0", "10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0"}},
"original"=>{"periods"=>{"1/2023"=>"901", "2/2023"=>"1315", "3/2023"=>"4377", "4/2023"=>"1815", "5/2023"=>"1835", "6/2023"=>"896", "7/2023"=>"1996", "8/2023"=>"4219", "9/2023"=>"3369", "10/2022"=>"3335", "11/2022"=>"4198", "12/2022"=>"3127"}},
"NominalCode"=>"500"},
"residential_private"=>
{"current"=>{"periods"=>{"1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0", "7/2023"=>"0", "8/2023"=>"0", "9/2023"=>"0", "10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0"}},
"original"=>{"periods"=>{"1/2023"=>"4389", "2/2023"=>"1265", "3/2023"=>"4496", "4/2023"=>"980", "5/2023"=>"1617", "6/2023"=>"1396", "7/2023"=>"4839", "8/2023"=>"4248", "9/2023"=>"1770", "10/2022"=>"3513", "11/2022"=>"1294", "12/2022"=>"4240"}},
"NominalCode"=>"520"}}
如您所见,作为JSONB,它是按长度顺序存储的。在调用以正确的方式显示时,我需要对此进行排序。
我确信,我可以使用以下方法对periods
嵌套哈希进行排序:
{ periods: periods_hash[:periods].sort_by { |k, _v| Date.strptime(k, "%d/%Y") }.to_h }
这将创建一个新的periods
哈希,并对其进行排序。
我的问题是进入这个嵌套哈希,并返回完整的哈希,没有任何变化,但这些句点的顺序。
我目前的努力产生了以下结果:
def order_data
data.each do |_k, v|
v.each do |sk, sv|
next if sk.include? "NominalCode"
sv.each do |x, _y|
{ periods: x[:periods].sort_by { |k, _v| Date.strptime(k, "%d/%Y") }.to_h }
end
end
end
end
上面的内容不起作用,给了我no implicit conversion of Symbol into Integer
,因为我.each
‘--关于enummerable和散列符号的问题。
我期待的回报是:
{"residential_la"=>
{"current"=>{"periods"=>{"10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0", "1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0", "7/2022"=>"0", "8/2022"=>"0", "9/2022"=>"0"}},
"original"=>{"periods"=>{"10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0", "1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0", "7/2022"=>"0", "8/2022"=>"0", "9/2022"=>"0"}},
"NominalCode"=>"500"},
"residential_private"=>
{"current"=>{"periods"=>{"10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0", "1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0", "7/2022"=>"0", "8/2022"=>"0", "9/2022"=>"0"}},
"original"=>{"periods"=>{"10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0", "1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0", "7/2022"=>"0", "8/2022"=>"0", "9/2022"=>"0"}},
"NominalCode"=>"500"}
我不确定我是否应该映射来创建一个新的哈希,或者只是迭代每一个只修改子哈希,最终我缺乏理解,任何帮助和指导都是很感激的。
谢谢。
发布于 2022-10-13 12:59:28
鉴于以下任务定义:
我们需要在键periods
...
periods
) depth
)。
可以使用简单的递归算法(让我们将其命名为deep_sort_periods
):
从一个新的哈希(N) n[k] = v
)
v
不是散列,则保持原来的哈希状态(设置为
v
是哈希,k
是periods
--对值(n[k] = <your sorting logic>
)
v
是散列)排序,但k
是smth。对嵌套散列重复1-4,并将结果赋值给(n[k] = deep_sort_periods(v)
)
periods
。
实现完全可以遵循描述,有点像:
def deep_sort_periods(hash)
hash.each_with_object({}) do |(k, v), new_hash|
if !v.is_a?(Hash)
new_hash[k] = v
elsif k == "periods"
new_hash[k] = v.sort_by { |date, _| Date.strptime(date, "%d/%Y") }.to_h
else
new_hash[k] = deep_sort_periods(v)
end
end
end
然后
pry(main)> deep_sort_periods(hash)
=> {"residential_la"=>
{"current"=>{"periods"=>{"7/2022"=>"0", "8/2022"=>"0", "9/2022"=>"0", "10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0", "1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0"}},
"original"=>{"periods"=>{"7/2022"=>"0", "8/2022"=>"0", "9/2022"=>"0", "10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0", "1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0"}},
"NominalCode"=>"500"},
"residential_private"=>
{"current"=>{"periods"=>{"7/2022"=>"0", "8/2022"=>"0", "9/2022"=>"0", "10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0", "1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0"}},
"original"=>{"periods"=>{"7/2022"=>"0", "8/2022"=>"0", "9/2022"=>"0", "10/2022"=>"0", "11/2022"=>"0", "12/2022"=>"0", "1/2023"=>"0", "2/2023"=>"0", "3/2023"=>"0", "4/2023"=>"0", "5/2023"=>"0", "6/2023"=>"0"}},
"NominalCode"=>"500"}}
免责声明:如果对任务定义有更多的限制--例如,periods
不是任意嵌套的,而是位于固定的深度--那么任务很可能可以以更简洁和更好的方式解决,根本不需要递归.
https://stackoverflow.com/questions/74054667
复制相似问题