将真假字符串转换为布尔值并跳过哈希中的其余部分
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。
我有一个包含 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。