修改鍵和值

你可以建立一個新的雜湊值,修改了鍵或值,實際上你也可以使用 inject (AKA, reduce ) 新增或刪除鍵。例如,使用字串化鍵和大寫值生成雜湊:

fruit = { name: 'apple', color: 'green', shape: 'round' }
# => {:name=>"apple", :color=>"green", :shape=>"round"}

new_fruit = fruit.inject({}) { |memo, (k,v)| memo[k.to_s] = v.upcase; memo }

# => new_fruit is {"name"=>"APPLE", "color"=>"GREEN", "shape"=>"ROUND"}

雜湊是一個可列舉的,實質上是鍵/值對的集合。因此有 eachmapinject 等方法。

對於雜湊中的每個鍵/值對,評估給定塊,第一次執行的備忘錄值是傳遞給 inject 的種子值,在我們的例子中是空雜湊,{}memo 用於後續評估的值是前一個塊評估的返回值,這就是我們通過設定一個帶有值的鍵來修改 memo 然後在結尾處返回 memo 的原因。最終塊評估的返回值是 inject 的返回值,在我們的例子中是 memo

為了避免必須提供最終值,你可以使用 each_with_object

new_fruit = fruit.each_with_object({}) { |(k,v), memo| memo[k.to_s] = v.upcase }

甚至是地圖

Version >= 1.8

new_fruit = Hash[fruit.map{ |k,v| [k.to_s, v.upcase] }]

(有關更多詳細資訊,請參閱此答案 ,包括如何操作雜湊值。)