【问题标题】:Ruby: replace hash value with value from another hashRuby:用另一个哈希值替换哈希值
【发布时间】:2013-07-21 06:36:44
【问题描述】:

我似乎无法弄清楚这一点。如果我有两个散列,第一个散列中的值应始终与第二个散列中的键匹配:

hash1 = { :table => 'name', :action => 'view' }
hash2 = { 'name'  => 'first_name', 'group'   => 'user_group' }

键 :table 是常量,但值是动态的。如何将 hash1 中的值与 hash2 中的值交换,其中键与 hash1 中的值匹配?不知道实际的键或值是什么(hash1 中的 :table 除外)?希望这是有道理的,更新后的 hash1(或新的 hash)应该是这样的:

hash1 = { :table => 'first_name', :action => 'view' }

提前致谢。

【问题讨论】:

  • 我没有看到任何代码表明您试图自己解决这个问题。

标签: ruby hash


【解决方案1】:
hash1.each{|k, v| hash1[k] = hash2[v] if hash2.key?(v)}

【讨论】:

    【解决方案2】:

    我会写(非破坏性的):

    hash3 = Hash[hash1.map { |k, v| [k, hash2.fetch(v, v)] }]
    #=> {:table=>"first_name", :action=>"view"}
    

    【讨论】:

    • 我不知道OP是否真的打算这样做,但问题是要求破坏性地修改hash1。
    • 您的fetch 出了什么问题?我觉得很好。现在,您需要假设 hash2 不包含 nil 或 falue 值。
    • @sawa:又是fetch。我似乎无法决定我更喜欢[k] || v 还是h.fetch(k, v)。
    【解决方案3】:
    hash1 = { :table => 'name', :action => 'view' }
    hash2 = { 'name'  => 'first_name', 'group'   => 'user_group' }
    
    hash2.each{|k,v| hash1[hash1.key(k)] = v if hash1.has_value? k}
    p hash1
    # >> {:table=>"first_name", :action=>"view"}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2017-02-16
      相关资源
      最近更新 更多