Ruby嵌套Hash格式化方法:实现相同id下合并names数组
实现嵌套Hash结构的解决方案
你可以直接调整哈希生成逻辑,在遍历数据时直接组装嵌套结构,性能更高逻辑也更清晰,优化后代码如下:
# 预加载关联的ListImportGroup数据,避免N+1查询问题 imports = ListImports.includes(:list_import_groups).limit(20).order(created_at: :DESC) pub_hash_true = [] pub_hash_false = [] imports.each do |import| # 直接组装符合要求的嵌套结构 current_item = { id: import.id, trans: import.trans, accepted: import.amount, names: import.list_import_groups.map do |group| { name: group.name, amount: group.amount } end } # 按accepted字段值分发到对应数组,和原有逻辑保持一致 current_item[:accepted] ? pub_hash_true << current_item : pub_hash_false << current_item end
如果你不想修改原有生成逻辑,只想对已经得到的平级哈希数组做格式化,可以用group_by方法按id聚合,示例如下:
# 以平级的pub_hash_false为例,pub_hash_true处理逻辑完全相同 formatted_false = pub_hash_false.group_by { |item| item[:id] }.values.map do |same_id_items| base_info = same_id_items.first { id: base_info[:id], accepted: base_info[:accepted], trans: base_info[:trans], names: same_id_items.map { |i| { name: i[:name], amount: i[:amount] } } } end
处理后得到的pub_hash_true、pub_hash_false或者格式化后的数组,就完全符合你预期的嵌套结构。
内容的提问来源于stack exchange,提问作者taggy
相关产品推荐
相关产品推荐

