哈希中的每个键大写

时间:2013-10-12 19:20:03

标签: ruby arrays hash

我有一个看起来像这样的长哈希(这只是它的一部分):

countries =
  [
    ['AFGHANISTAN','AF'],
    ['ÅLAND ISLANDS','AX'],
    ['ALBANIA','AL'],
    ['ALGERIA','DZ'],
    ['AMERICAN SAMOA','AS']
  ]

我想大写每个值的键。所以阿富汗人会去阿富汗。然后我想得到相同的哈希值。

我尝试过使用它:

countries.each do |key, value|
  puts key.capitalize
end

但它只给了我钥匙。我想把大写的键放回哈希。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

代码不会修改哈希值。它只打印大写键。

您应删除旧条目并添加新条目。或者按照以下方式创建新哈希:

countries = Hash[[
  ['AFGHANISTAN','AF'],
  ['ÅLAND ISLANDS','AX'],
  ['ALBANIA','AL'],
  ['ALGERIA','DZ'],
  ['AMERICAN SAMOA','AS']
]]
countries = Hash[countries.map {|country, abbr| [country.capitalize, abbr] }]
# => {
#   "Afghanistan"=>"AF",
#   "Åland islands"=>"AX",
#   "Albania"=>"AL",
#   "Algeria"=>"DZ",
#   "American samoa"=>"AS"
# }

答案 1 :(得分:2)

你的“哈希”不是哈希,而是数组。

countries.each do |name, abbreviation|
  temp = name.dup 
  name.clear
  name << temp.split(' ').map(&:capitalize!).join(' ')
end

这会将每个名称更改为大写名称。

[
 ["Afghanistan", "AF"],
 ["Åland Islands", "AX"],
 ["Albania", "AL"],
 ["Algeria", "DZ"],
 ["American Samoa", "AS"]
]

这也解决了多个单词,并且因为你提到想要保持相同的“散列”,这保持相同的数组,object_id(当然,也是每个String的数组)不会改变,它会改变它。

正如@muistooshort提到的那样,像Éclair这样的国家甚至没有问题。但是,如果你有一个尖锐的角色(例如)在词的中间大写,capitalize不会处理这些事情,还有更多的工作要做。

答案 2 :(得分:0)

#each不修改可枚举,它只是迭代它。您想使用#injecthttp://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-inject

像:

countries.inject({}){|caps_hash,og_hash| caps_hash.merge(og_hash[0].capitalize => og_hash[1] ) }