我有一個嵌套的 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可列舉和哈希符號存在問題。
我期望的回報是:
{"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"}
我不確定我是否應該映射以創建一個新的哈希,或者只是迭代每個以僅修改子哈希,最終我缺乏理解,感謝任何幫助和指導。
謝謝。
uj5u.com熱心網友回復:
給定以下任務定義:
- 我們需要對 key 下的任何哈希進行排序
periods... - 無論其 (
periods) 深度如何 - 并保持其他一切完好無損
可以使用簡單的遞回演算法(讓我們命名deep_sort_periods):
- 從一個新的哈希 (n) 開始
- 檢查現有哈希的下一個鍵/值(k/v)
- 如果
v不是散列,請保持原樣(設定n[k] = v) - 如果
v是哈希并且k是periods- 對值進行排序 (n[k] = <your sorting logic>) - 否則 (
v是一個散列,但k它是不同的,不是periods) - 對嵌套散列重復 1-4 并將結果分配給n[k](n[k] = deep_sort_periods(v))
實作可以從字面上遵循描述,有點:
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://www.uj5u.com/qiye/514774.html
下一篇:找到給定整數的不同三元組和的數量
