首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回有序的JSONB嵌套哈希

返回有序的JSONB嵌套哈希
EN

Stack Overflow用户
提问于 2022-10-13 11:00:41
回答 1查看 39关注 0票数 1

我有一个嵌套的JSONB散列,需要按日期顺序显示。

散列的存储方式如下:

代码语言:javascript
运行
复制
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嵌套哈希进行排序:

代码语言:javascript
运行
复制
{ periods: periods_hash[:periods].sort_by { |k, _v| Date.strptime(k, "%d/%Y") }.to_h }

这将创建一个新的periods哈希,并对其进行排序。

我的问题是进入这个嵌套哈希,并返回完整的哈希,没有任何变化,但这些句点的顺序。

我目前的努力产生了以下结果:

代码语言:javascript
运行
复制
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和散列符号的问题。

我期待的回报是:

代码语言:javascript
运行
复制
{"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"}

我不确定我是否应该映射来创建一个新的哈希,或者只是迭代每一个只修改子哈希,最终我缺乏理解,任何帮助和指导都是很感激的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-13 12:59:28

鉴于以下任务定义:

我们需要在键periods...

  • regardless of its (periods) depth

  • 下对任何散列进行排序,并保持其他所有内容保持不变(

)。

可以使用简单的递归算法(让我们将其命名为deep_sort_periods):

从一个新的哈希(N) n[k] = v)

  • If

  • 开始,检查现有散列

  • 的下一个键/值(k/v),如果v不是散列,则保持原来的哈希状态(设置为

  • v是哈希,kperiods --对值(n[k] = <your sorting logic>)

  • Otherwise (v是散列)排序,但k是smth。对嵌套散列重复1-4,并将结果赋值给(n[k] = deep_sort_periods(v))

periods

实现完全可以遵循描述,有点像:

代码语言:javascript
运行
复制
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

然后

代码语言:javascript
运行
复制
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不是任意嵌套的,而是位于固定的深度--那么任务很可能可以以更简洁和更好的方式解决,根本不需要递归.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74054667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档