将真假字符串转换为布尔值并跳过哈希中的其余部分

Convert true-false strings to boolean & Skip the rest in a hash

我有一个包含 2 个哈希数组的哈希

h = {
  "budget_options"=>[
    {"amount"=>"1.0", "text"=>"budget options"},
    {"amount"=>"2.0", "most_popular"=>"true", "text"=>"budget options"},
    {"amount"=>"3.0", "text"=>"budget options"}
  ],
  "pcb_budget_options"=>[
    {"amount"=>"1.0"},
    {"amount"=>"0.0"},
    {"amount"=>"-1.0", "most_popular"=>"true"}
  ]
}

我只想将 "most_popular" 值从字符串转换为 布尔值 我尝试这样做但它结束了达到 n3 时间复杂度。

是否有内置方法可以做到这一点? 任何形式的帮助都会得到帮助。

我认为这符合您的要求。我没有计算它的O。 我使用 Marshal#dump/load 技巧在操作之前对对象进行了深度复制。

mp = "most_popular"
obj = Marshal.load(Marshal.dump(h))
obj.each_key {|k| obj[k].each {|v| v[mp] = v[mp] == "true" ? true : false if v[mp] }}

另请参阅下面 Cary 的评论,了解内部块的更简洁版本。

如果你不想改变h你可以写

h.transform_values do |arr|
  arr.map do |g|
    g.merge({})
     .tap { |f| f["most_popular"] = f["most_popular"]=="true" if f.key?("most_popular") }
  end
end
  #=> {
  #     "budget_options"=>[
  #       {"amount"=>"1.0", "text"=>"budget options"},
  #       {"amount"=>"2.0", "most_popular"=>true, "text"=>"budget options"},
  #       {"amount"=>"3.0", "text"=>"budget options"}
  #     ],
  #     "pcb_budget_options"=>[
  #       {"amount"=>"1.0"},
  #       {"amount"=>"0.0"},
  #       {"amount"=>"-1.0", "most_popular"=>true}
  #     ]
  #   }

g.merge({}) 的目的是避免改变内部哈希值。参见 Hash#transform_values, Hash#merge and Object#tap