转换Ruby哈希并将其转换为人类可读的字符串

时间:2019-06-17 19:54:47

标签: ruby string hash

我有以下Ruby哈希:

{"limit"=>250, "days_ago"=>14, "days_ago_filter"=>"lt", "key"=>3}

我想将其转换为人类可读的字符串,并根据需要转换某些值:

Limit: 250 - Days Ago: 14 - Days Ago Filter: Less than - Key: D♯, E♭

因此,在这种情况下,lt实际上转换为Less than3的{​​{1}}会转换为key

我几乎可以做到这一点:

D♯, E♭

但是翻译这些价值观是我遇到的障碍。

2 个答案:

答案 0 :(得分:1)

我建议使用散列来映射可能的值,例如:

days_ago_filter_map = {
  "lt" => "Less than",
  # ...other cases here...
}

musical_key_map = {
  3 => "D♯, E♭",
  # ...other cases here...
}

然后您可以打开key

variables.map do |key, value| 
  label = "#{key.split('_').map(&:capitalize).join(' ')}"
  formatted_value = case key
  when "days_ago_filter" then days_ago_filter_map.fetch(value)
  when "key" then musical_key_map.fetch(value)
  else value
  end
  "#{label}: #{formatted_value}" 
end.join(' - ')

请注意,如果您的地图上缺少任何内容,则以上代码将引发KeyNotFound错误。您可以在fetch中设置默认值,例如

days_ago_filter_map.fetch(value, "Unknown filter")
musical_key_map.fetch(value, "No notes found for that key")

答案 1 :(得分:0)

您也可以为此类映射创建YAML文件:

values_for_replacement = {
  "lt" => "Less than",
3 => "D♯, E♭"
}

您可以尝试以下操作:

variables.map {|k,v|
value_to_be_replaced = values_for_replacement[v]
"#{k.humanize}: #{(value_to_be_replaced.present? ? value_to_be_replaced : v)}"}.join(' - ')