ruby - 如何用另一个键/值替换哈希键/值

时间:2016-07-01 16:29:19

标签: ruby

我有一个哈希

  hash = {"some_wierd_name"=>"cheesemonster", .....}

我希望这个哈希为

  hash = {"preferred_name"=>"cheesemonster", ......}

最短的方法是什么?

4 个答案:

答案 0 :(得分:5)

hash["preferred_name"] = hash.delete("some_wierd_name")

哈希键是冻结的字符串,它们无法在原地进行修改,并且无法从对象中删除冻结状态。也就是说,使用prependreplace的技巧无效后会导致:

RuntimeError: can't modify frozen String

因此,唯一的可能性是:删除旧值并插入新值。

答案 1 :(得分:3)

hash = {"some_wierd_name"=>"cheesemonster"}

hash["preferred_name"] = hash["some_wierd_name"]
hash.delete("some_wierd_name")

答案 2 :(得分:1)

  • 如果我们想要替换键/值两者,可以通过使用除方法之外的rails轻松完成。您也可以使用delete方法,但一次使用一个键/值对,但除了可以删除2个或更多键/值对之外。

    hash = {a: 1, b:2, c: 3}
    hash.except!(:a)[:d] = 4 
    and it is similar to these two following line
    hash.except!(:a) 
    hash[:d] = 4
    hash = {:b=>2, :c=>3, :d=>4}
    
  • 仅更改哈希的键,值保持不变。人们也可以使用拒绝。 reject和delete_if是相同的。

    hash[:e] = hash.delete(:d) 
         or 
    temp = hash[d]
    hash.delete_if{|key| key ==:d }
    hash[:e] = temp
    hash = {:b=>2, :c=>3, :e=>4}
    
  • 仅更改值,键保持不变。这个很容易。

    hash[:e] = 5
    

参考文献:

答案 3 :(得分:0)

对于单个密钥,请使用delete

hash["preferred_name"] = hash.delete("some_wierd_name")

如果您需要更新所有密钥,我建议使用inject

new_hash = hash.inject({}) do |returned_hash, (key, value)|
  returned_hash[key] = value.upcase;
  returned_hash
end