ruby - 将 ruby​​ 哈希转换为数组的最佳方法是什么

标签 ruby arrays hash

我有一个像这样的 ruby​​ 散列

{ "stuff_attributes" => {
     "1" => {"foo" => "bar", "baz" => "quux"}, 
     "2" => {"foo" => "bar", "baz" => "quux"} 
   }
}

我想把它变成一个看起来像这样的散列

{ "stuff_attributes" => [
    { "foo" => "bar", "baz" => "quux"},
    { "foo" => "bar", "baz" => "quux"}
  ]
}

我还需要保留键的数字顺序,并且键的数量是可变的。上面是 super 简化的,但我在底部包含了一个真实的例子。执行此操作的最佳方法是什么?

附言

还需要递归

就递归而言,这是我们可以假设的:

1)需要操作的键会匹配/_attributes$/ 2)散列将有许多其他键不匹配/_attributes$/ 3)散列中的键总是一个数字 4) _attributes 散列可以在任何其他键下的散列的任何级别

这个散列实际上是来自 Controller 中创建操作的参数散列。这是需要使用此例程解析的真实示例。

{
    "commit"=>"Save", 
    "tdsheet"=>{
    "team_id"=>"43", 
    "title"=>"", 
    "performing_org_id"=>"10", 
    "tdsinitneed_attributes"=>{ 
        "0"=>{
            "title"=>"", 
            "need_date"=>"", 
            "description"=>"", 
            "expected_providing_organization_id"=>"41"
            }, 
        "1"=>{
            "title"=>"", 
            "need_date"=>"", 
            "description"=>"", 
            "expected_providing_organization_id"=>"41"
            }
        }, 
        "level_two_studycollection_id"=>"27", 
        "plan_attributes"=>{
            "0"=>{
                "start_date"=>"", "end_date"=>""
            }
        }, 
        "dataitem_attributes"=>{
            "0"=>{
                "title"=>"", 
                "description"=>"", 
                "plan_attributes"=>{
                    "0"=>{
                        "start_date"=>"", 
                        "end_date"=>""
                        }
                    }
                }, 
            "1"=>{
                "title"=>"", 
                "description"=>"", 
                "plan_attributes"=>{
                    "0"=>{
                        "start_date"=>"", 
                        "end_date"=>""
                        }
                    }
                }
            }
        }, 
    "action"=>"create", 
    "studycollection_level"=>"", 
    "controller"=>"tdsheets"
}

最佳答案

请注意,在转换之前测试所有键是否都是数字可能会很长...

def array_from_hash(h)
  return h unless h.is_a? Hash

  all_numbers = h.keys.all? { |k| k.to_i.to_s == k }
  if all_numbers
    h.keys.sort_by{ |k| k.to_i }.map{ |i| array_from_hash(h[i]) }
  else
    h.each do |k, v|
      h[k] = array_from_hash(v)
    end
  end
end

关于ruby - 将 ruby​​ 哈希转换为数组的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/756431/

相关文章:

python - 为小 k(<=5) 从 k 明智的独立散列族生成散列函数的最快方法

c# - 初学者散列和加盐

c++ - 哈希的 unordered_map

ruby-on-rails - before_filter 在 state_machine :( 中不工作

ruby - 记录 shell 命令的所有输出

ruby-on-rails - 将 Paperclip 与 rails-redis 一起使用时为 "IOError - closed stream"

c - 从数组创建二叉树的问题

ruby-on-rails - 在嵌套资源中创建新项目的问题

c# - 数组越大,C# 数组调整大小所需的时间越长吗?

C++ 巨大的整数数组存储为长整数